我不知道如何使用SqlAlchemy 0.6.0和MySQL 5在唯一的列上设置AUTO_INCREMENT。
我知道这可以在MySQL中完成,但是我不想为了为我的应用程序设置数据库而不得不分发额外的.sql脚本。我希望SqlAlchemy从Python中构建模式。
到目前为止,我发现在SqlAlchemy中有两种方法可以使列成为自动递增类型的列:
primary_key=True
且在其定义中未设置autoincrement=False
的sqlalchemy.types.Integer
列。这将向列添加一个INDEX(m,n)
属性。
SERIAL
列类型。带有MySQL的
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)
)
发布于 2010-05-31 23:47:17
您可能会对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);
发布于 2011-03-24 02:58:22
摘自http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg19744.html
现在最好的办法是发布一个应用
AUTO_INCREMENT
的ALTER TABLE
,如果MySQL支持的话。
from sqlalchemy.schema import DDL
DDL("ALTER TABLE person ...", on='mysql').execute_at('after-create',
person_table)[..]
https://stackoverflow.com/questions/2937229
复制相似问题