首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否在具有非主键的列上使用SqlAlchemy和MySQL设置AUTO_INCREMENT?

是否在具有非主键的列上使用SqlAlchemy和MySQL设置AUTO_INCREMENT?
EN

Stack Overflow用户
提问于 2010-05-30 09:39:04
回答 2查看 10K关注 0票数 18

我不知道如何使用SqlAlchemy 0.6.0和MySQL 5在唯一的列上设置AUTO_INCREMENT。

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

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

  1. 它是表中第一个具有primary_key=True且在其定义中未设置autoincrement=Falsesqlalchemy.types.Integer列。
    • With column.

这将向列添加一个INDEX(m,n)属性。

  • With Postgres这将导致使用SERIAL列类型。带有MySQL的

  • 将向Postgres添加AUTO_INCREMENT属性

  1. 它是一个sqlalchemy.types.Integer列,使用sqlalchemy.schema.Sequence对象作为参数实例化。
    • With MSSQL这会将INDEX(m,n)属性添加到列。
    • With Postgres这会导致使用SERIAL列类型。
    • With MySQL这似乎会得到Postgres

所以我不能使用#1,因为我想要auto_increment的列不在主键中(也不应该在主键中)。我不能使用#2,因为它不适用于MySQL。

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

代码语言:javascript
复制
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来创建表:

代码语言:javascript
复制
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呢?

代码语言:javascript
复制
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)
)
EN

回答 2

Stack Overflow用户

发布于 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 TABLEDROP PRIMARY KEY,用ADD UNIQUE KEY替换它。这将保留该列上的AUTO_INCREMENT功能。然后,您可以在其他列上创建PRIMARY KEY

要分解它,您的第一步是按如下方式创建表:

代码语言:javascript
复制
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密钥:

代码语言:javascript
复制
ALTER TABLE person DROP PRIMARY KEY, ADD UNIQUE KEY(id);

最后,在其他列中添加您的PRIMARY KEY

代码语言:javascript
复制
ALTER TABLE person ADD PRIMARY KEY(first_name, last_name);
票数 5
EN

Stack Overflow用户

发布于 2011-03-24 02:58:22

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

现在最好的办法是发布一个应用AUTO_INCREMENTALTER TABLE,如果MySQL支持的话。

代码语言:javascript
复制
from sqlalchemy.schema import DDL
DDL("ALTER TABLE person ...", on='mysql').execute_at('after-create', 
    person_table)[..]
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2937229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档