我无法弄清楚如何使用带有MySQL 5的SqlAlchemy 0.6.0在UNIQUE列上设置AUTO_INCREMENT。
我知道这可以在MySQL中完成,但我不想分发额外的.sql脚本来为我的应用程序设置数据库。我希望SqlAlchemy在Python中构建模式。
据我所知,到目前为止,有两种方法可以使列成为SqlAlchemy中的自动递增类型列:
sqlalchemy.types.Integer
列primary_key=True
,其定义中未设置autoincrement=False
。
INDEX(m,n)
属性。SERIAL
列类型。AUTO_INCREMENT
属性添加到列中。sqlalchemy.types.Integer
列,并以sqlalchemy.schema.Sequence
对象作为参数进行实例化。
INDEX(m,n)
属性。SERIAL
列类型。所以我不能使用#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)
)
答案 0 :(得分:5)
您可能对I need to auto_increment a field in MySQL that is not primary key
感兴趣我不熟悉sqlalchemy,但我知道这可以在MySQL中完成。您必须先将id
列定义为PRIMARY KEY
并将其设置为AUTO_INCREMENT
。然后,您可以ALTER TABLE
和DROP 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)[..]