我可以根据 SQLAlchemy 中的另一个数据库行添加新项目吗?

Posted

技术标签:

【中文标题】我可以根据 SQLAlchemy 中的另一个数据库行添加新项目吗?【英文标题】:Can I add a new item based on another database row in SQLAlchemy? 【发布时间】:2015-08-10 06:41:33 【问题描述】:

正如标题所示,我想根据 SQLALchemy 中的另一行添加一个带有 id 的行。目前,我正在添加一个额外的select,但我想摆脱它。我知道这在 mysql 中是可能的,所以我只是想弄清楚 SQLAlchemy 版本。这是我目前拥有的:

keywords = ['a', 'b', 'c']
prefix_id = session.query(Prefix.id)\
    .filter_by(name=some_prefix).first()[0]
inventory_item = InventoryItem(
    item=some_item, prefix_id=prefix_id, address=some_address)
inventory_item_metas = [InventoryItemMeta(
    inventory_item=inventory_item,
    type='keyword',
    value=keyword) for keyword in keywords]

请注意,我会根据返回的 id 添加更多项目,因此我希望尽可能高效地在一个事务中完成所有操作。

【问题讨论】:

看看这个:SO answer它可能会给你一些想法。 【参考方案1】:

如果i0 是您要复制的对象,您可以将其从会话中移除以使其成为临时对象:

i0 = select
session.expunge(i0)

然后你将它的id 设置为None,这样它就不再引用任何真实的数据库行了:

i0.id = None

然后就可以修改对象了:

i0.a = 1
i0.b = 2

最后,您将瞬态对象添加回会话并刷新它以获得新的id

session.add(i0)
session.flush()

你会发现对象现在是一个新行:

print i0.id #New ID

如果您通过旧 ID 查找内容,您将拥有另一个与更改前相同的对象,也具有原始 ID。

【讨论】:

这如何回答我的问题?我不想复制任何对象。

以上是关于我可以根据 SQLAlchemy 中的另一个数据库行添加新项目吗?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 根据另一个表中的值过滤表的最佳方法

如何根据同一数据库中的另一个值更改mysql中的值?

SQLAlchemy 递归查询结果集排序

根据 Excel 中的另一个单元格自动填充单元格数据

是否可以根据从 Swift 中的 UIViewController 继承的类中的另一个来初始化变量?

如何根据 Python 中的另一个数据框过滤掉行? [复制]