在带有非主键的列上使用带有MySQL的SqlAlchemy设置AUTO_INCREMENT?

ant*_*ris 17 mysql sqlalchemy auto-increment

我无法弄清楚如何使用带有MySQL 5的SqlAlchemy 0.6.0在UNIQUE列上设置AUTO_INCREMENT.

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

到目前为止,我发现有两种方法可以使列成为SqlAlchemy中的自动递增类型列:

  1. 它是sqlalchemy.types.Integer表中第一列在其定义中设置primary_key=True和未autoincrement=False设置的列.
    • 使用MSSQL,这会INDEX(m,n)为列添加属性.
    • 使用Postgres会导致使用SERIAL列类型.
    • 使用MySQL将AUTO_INCREMENT属性添加到列.
  2. 它是一个sqlalchemy.types.Integer列,并以sqlalchemy.schema.Sequence对象作为参数进行实例化.
    • 使用MSSQL,这会INDEX(m,n)为列添加属性.
    • 使用Postgres会导致使用SERIAL列类型.
    • 使用MySQL这似乎被忽略了.

所以我不能使用#1,因为我想要auto_increment的列不在主键中(也不应该).我不能使用#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)
Run Code Online (Sandbox Code Playgroud)

并生成此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)
)
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能让它生成以下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)
)
Run Code Online (Sandbox Code Playgroud)

def*_*nes 5

您可能对我需要在MySQL中自动递增不是主键的字段感兴趣

我不熟悉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)
);
Run Code Online (Sandbox Code Playgroud)

接下来修改id密钥:

ALTER TABLE person DROP PRIMARY KEY, ADD UNIQUE KEY(id);
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE person ADD PRIMARY KEY(first_name, last_name);
Run Code Online (Sandbox Code Playgroud)


pri*_*bel 5

摘自http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg19744.html

现在最好的办法是发布一个ALTER TABLE适用于 的 AUTO_INCREMENT,如果 MySQL 支持的话。

from sqlalchemy.schema import DDL
DDL("ALTER TABLE person ...", on='mysql').execute_at('after-create', 
    person_table)[..]
Run Code Online (Sandbox Code Playgroud)