使用SqlAlchemy和MySQL在列上设置非主键的自动增量?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我不知道怎么设置使用SqlAlchemy0.6.0和MySQL 5对唯一列进行增量。

我知道这可以在MySQL中完成,但我不想再分发额外的内容。SQL脚本,以便为我的应用程序设置数据库。我希望SqlAlchemy在Python中构建模式。

据我所发现,在SqlAlchemy中,有两种方法可以使列成为自动递增的类型列:

  1. 这是第一次sqlalchemy.types.Integer表中的primary_key=True也没有autoincrement=False在它的定义中。
    • 使用MSSQL,这将添加一个INDEX(m,n)属性设置为列。
    • 对于Postgres,这会导致SERIAL要使用的列类型。
    • 使用MySQL添加AUTO_INCREMENT属性设置为列。

  1. 这是一个sqlalchemy.types.Integer列,并使用sqlalchemy.schema.Sequence对象作为参数。
    • 使用MSSQL,这将添加一个INDEX(m,n)属性设置为列。
    • 对于Postgres,这会导致SERIAL要使用的列类型。
    • 对于MySQL,这似乎被忽略了。

所以我不能使用#1,因为我想要自动生成的列[医]主键中没有增量(也不应该是)。我不能使用#2,因为它不适用于MySQL。

基本上,定义表的代码如下所示:

from sqlalchemy import Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.schema import Sequence
from sqlalchemy.types import Integer, Unicode
Base = declarative_base()

class Person(Base):
    __tablename__ = "person"
    id = Column(Integer, nullable=False, unique=True)
    first_name = Column(Unicode(100), nullable=False, primary_key=True)
    last_name = Column(Unicode(100), nullable=False, primary_key=True)

并生成此SQL以创建表:

CREATE TABLE person (
    id INTEGER NOT NULL, 
    first_name VARCHAR(100) NOT NULL, 
    last_name VARCHAR(100) NOT NULL, 
    PRIMARY KEY (first_name, last_name), 
    UNIQUE (id)
)

我能做些什么来让它生成以下SQL?

CREATE TABLE person (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    first_name VARCHAR(100) NOT NULL, 
    last_name VARCHAR(100) NOT NULL, 
    PRIMARY KEY (first_name, last_name), 
    UNIQUE (id)
)
提问于
用户回答回答于

你现在最好的办法是ALTER TABLE应用AUTO_INCREMENT,如果MySQL支持这一点的话。

from sqlalchemy.schema import DDL
DDL("ALTER TABLE person ...", on='mysql').execute_at('after-create', 
    person_table)[..]
用户回答回答于

我不熟悉sqlalchemy,但我知道这可以在MySQL中实现。必须首先定义id列作为PRIMARY KEY并设置它AUTO_INCREMENT.然后你就可以ALTER TABLEDROP PRIMARY KEY,将其替换为ADD UNIQUE KEY.这将保护AUTO_INCREMENT该列的功能。然后,您可以创建PRIMARY KEY在其他柱子上。

要将其分解,第一步是创建表:

CREATE TABLE person (
    id INTEGER NOT NULL AUTO_INCREMENT,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
);

下一步修改id钥匙:

ALTER TABLE person DROP PRIMARY KEY, ADD UNIQUE KEY(id);

最后,添加PRIMARY KEY在其他栏上:

ALTER TABLE person ADD PRIMARY KEY(first_name, last_name);

扫码关注云+社区