我使用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保存到原始对象中? 谢谢。

===============>>#1 票数:0 已采纳

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

  ask by Vincent translate from so

未解决问题?本站智能推荐:

1回复

使用SQLAlchemy ORM将临时对象自动添加到会话

我在ORM映射器中使用SQLAlchemy。 假设我有一个Url类,它指向这样的DomainName类: 以我的经验来看,如果我同时创建一个Url和一个DomainName ,将一个添加到会话中并提交就足够了,而另一个也持久化到数据库中就足够了。 就像是: 似乎使用这种方
1回复

SQLAlchemy会话的上下文/作用域是否需要非自动对象/属性过期?

情况:具有基本属性的简单类 在我正在处理的应用程序中,特定类的实例在其生命周期结束时会保留下来,并且尽管随后没有对其进行修改,但可能需要读取其属性。 例如,实例的end_time或其相对于同一类其他实例的顺序位置(初始化的第一个实例的值为1,下一个实例的值为2, end_time )。
3回复

SQLAlchemy:将列名称自动映射为值

背景 当我想创建一个字典以将列名映射到结果中的值时,我需要单独列出每个列 这些模型是ORM映射的, 不是 SQLAlchemy核心。 题 对于具有许多列的表,这效率不高,也无法对其他表重复使用相同的代码。 我尝试了以下操作,但无法获取列名 编辑1
3回复

在SQLAlchemy中映射“假”对象

我不确定这是什么,因为它对我来说是新的,但这是我想要做的: 我的数据库中有两个表:TableA和TableB。 TableA有pk a_id和另一个叫a_code的字段。 TableB有pk b_id和另一个叫做b_code的字段。 我将这些表映射到我的sqlalchemy代码中
1回复

SQLAlchemy - 从自动加载表的内部联接映射列的子集

我刚开始使用SQLAlchemy来处理现有的Postgres DB。 我想做的是自动加载两个表,执行内连接并将列的子集映射到对象。 为了完成除最后一部分之外的所有部分,我编写了以下代码: 我应该如何修改此代码以断言我只想将一些指定的列映射到DBObj? 我搜索得很远,似乎无法找到如
1回复

请求一个简单的alembic工作示例,用于自动生成迁移

我从我的ubuntu安装了alembic 0.3.4,sqlalchemy,SQLite版本3.7.4,并将SQLAlchemy 0.6.4升级到SQLAlchemy 0.7或更高版本。 我按照说明操作: http : //alembic.readthedocs.org/en/latest/t
1回复

SQLAlchemy:是否有任何好的自动重命名列的方法

我使用SQLAlchemy ORM几天了,我正在寻找一种在Session.query()结果中获取表名前缀的方法。 例如 : 这将显示: 我想得到类似的东西: 有什么方法可以做到,而无需更改类属性和表列名称。 此示例有点虚构,但出于更一般的目的,我想在结果中为所有
1回复

适当地改变映射对象的__setattr__方法

所以,我有一个Web应用程序,其中有一个数据库对象,其中包含我想在redis存储中缓存的属性。 手动操作相对简单,如下所示: 这里的问题是它是一个在整个代码库中的许多地方都被改变的属性。 并不意味着这种方法不起作用,它只是意味着它使得代码非常重复。 我宁愿只有一个缓存包装器,我可以
1回复

SQLAlchemy关系错误:对象没有属性'c'

我使用sqlautocode生成我的模型和所有关系。 我正在尝试做一个简单的查询 出于某种原因,我不断收到此错误消息: 如果我注释掉关系定义,那么上面的查询就可以了。 sqlautocode生成的关系定义看起来对我来说,但我是SqlAlchemy的新手。 我不知道如何解决这
2回复

SQLAlchemy将标量对象转换为列表

嗨,我想将“ filter()”方法返回的实例对象(标量对象)转换为列表。 是否有可能获得类似于“ all()”方法返回的列表的列表。 有什么方法吗?