自动增量未写入对象

Posted

技术标签:

【中文标题】自动增量未写入对象【英文标题】:Autoincrement not written to object 【发布时间】:2013-04-16 15:58:48 【问题描述】:

我使用 SQLAlchemy 作为我的 ORM 层来访问我的 mysql 数据库。

我说的是表格、映射器和模型:

CREATE TABLE user (
    uid INT(12) NOT NULL auto_increment,
    email VARCHAR(128) NOT NULL,
    password VARCHAR(128) NOT NULL,
    display_name VARCHAR(128) NOT NULL,
    timezone VARCHAR(96) NOT NULL,
    join_date DATETIME NOT NULL,
    last_login DATETIME NOT NULL,
    verified INT(1) NOT NULL DEFAULT 0,
    PRIMARY KEY (uid),
    UNIQUE (email)
) ENGINE=InnoDB;

class User(object):
    def __init__(self, id=0, email="", password="", displayName="",
                 timezone="UTC", joinDate=None, lastLogin=None, verified=False):
    self.id = id
    self.email = email
    self.password = password
    self.displayName = displayName
    self.timezone = timezone
    self.joinDate = joinDate or datetime.utcnow()
    self.lastLogin = lastLogin or datetime.utcnow()
    self.verified = verified


userTable = sqlalchemy.Table('user', meta, autoload=True)

sqlalchemy.orm.mapper(models.User, userTable, properties=
    'id': userTable.c.uid,
    'displayName': userTable.c.display_name,
    'joinDate': userTable.c.join_date,
    'lastLogin': userTable.c.last_login

问题是,每当我尝试通过 orm 层将对象插入数据库时​​,我希望新生成的 ID 会保存在我的原始对象中以供将来参考。否则这整件事对我来说毫无用处。

>>> session = Session()
>>> u = User(0, 'test@example.com', 'asdf', 'Test User')
>>> session.add(u)
>>> session.flush()
>>> u.id
0

有谁知道如何告诉 SQLALchemy 将 ID 保存到原始对象中?谢谢。

【问题讨论】:

您是否尝试过传递 NULL(或 None 或任何用于 NULL 的内容)而不是零? +1 - NULL 与零不同。 NULL 使用下一个 auto_increment ID,而 zero 使用文字零。 【参考方案1】:

当然,@msw 和@Aya 是对的。在插入数据库之前,对象的 id 属性必须为 None。

【讨论】:

以上是关于自动增量未写入对象的主要内容,如果未能解决你的问题,请参考以下文章

未找到自动增量插件 nextCount

postgres 自动增量未在显式 id 插入时更新

什么可能导致自动增量主键字段(mysql)上的重复 ID?

如何在 Realm 中设置自动增量键?

多个数据库的休眠自动增量字段

使用 Golang mongo-driver 的 MongoDB 自动增量 ID