gpt4 book ai didi

mysql - sqlalchemy:如何在mysql中使用自动增量添加表行

转载 作者:可可西里 更新时间:2023-11-01 07:45:14 32 4
gpt4 key购买 nike

我正在使用 sqlalchemy 0.8 和 mysql 5.5

我有一个简单的表,其 ORM 定义如下所示

class TrackingTable(db.Model):

__tablename__ = 'tracking_table'

trackid = db.Column(db.BigInteger,primary_key=True)
custid = db.Column(db.String(20), db.ForeignKey('customer.id'))
tracktime = db.Column(db.DateTime ,nullable=False)
formdata = db.Column(db.String(100),nullable=False)

我假设(根据文档)trackid 是 BIGINT 类型的主键,因此它将自动递增。

但是当我尝试在数据库中添加一条记录时

updateRecord = TrackingTable(custid='002',tracktime='2013-02-02',formdata='logged in')

db_session.add(updateRecord)
db_session.flush()
db_session.commit()

它给出警告警告:字段“trackid”没有默认值

trackid 总是取 0 值,因此第二次添加总是失败并报错IntegrityError: (IntegrityError) (1062, "Duplicate entry '0' for key 'PRIMARY'") 'INSERT INTO tracking_table (custid, tracktime, formdata)

请帮我解决这个问题。理想情况下,我希望这是一个由数据库处理的增量值,但我不知道如何实现这一点。

提前致谢

最佳答案

最可能的原因是数据库中存在一个名为 tracking_table 的表,该表定义了默认值为零但未设置 autoincrement< 的主键列,像这样(省略了一些列):

CREATE TABLE `tracking_table` (
`trackid` int(11) NOT NULL DEFAULT 0,
`formdata` varchar(100) DEFAULT NULL,
PRIMARY KEY (`trackid`)
)

因为表已经存在 SQLAlchemy 不会尝试创建它。一旦表包含 trackid 等于零的单行,尝试写入表将触发观察到的异常。

至少有两种方法可以解决这个问题:

  • 在 trackid 列上设置自动递增;如果表中没有行,或者 trackid 为零的单行,这将起作用

    ALTER TABLE tracking_table MODIFY COLUMN  trackid int(11) auto_increment

    如果已经有行,那就更复杂了

    ALTER TABLE tracking_table DROP CONSTRAINT PRIMARY KEY;
    ALTER TABLE tracking_table ADD COLUMN id int(11) primary key auto_increment;
    ALTER TABLE tracking_table DROP COLUMN trackid;
    ALTER TABLE tracking_table CHANGE COLUMN id trackid int(11) auto_increment;

    如果有外键关系就更麻烦了。

  • 在数据库中或使用 SQLALchemy 的元数据方法删除表并重新创建它。同样,外键关系会使事情复杂化。

关于mysql - sqlalchemy:如何在mysql中使用自动增量添加表行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074183/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com