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

时间:2010-05-30 01:39:04

标签: mysql sqlalchemy auto-increment

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

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

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

  1. 表格中的第一个sqlalchemy.types.Integerprimary_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这似乎被忽略了。
  3. 所以我不能使用#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)
    

    并生成此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)
    )
    

2 个答案:

答案 0 :(得分:5)

您可能对I need to auto_increment a field in MySQL that is not primary key

感兴趣

我不熟悉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);

答案 1 :(得分:4)

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

  

现在最好的办法是发出适用于ALTER TABLE的{​​{1}}   AUTO_INCREMENT,如果MySQL支持。

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