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

Eli*_*Eli 9 python mysql sqlalchemy flask-sqlalchemy

正如标题所示,我想在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]
Run Code Online (Sandbox Code Playgroud)

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

小智 2

如果i0是您要复制的对象,您可以将其从会话中删除以使其暂时存在:

i0 = select
session.expunge(i0)
Run Code Online (Sandbox Code Playgroud)

然后将其设置idNone,使其不再引用任何真实的数据库行:

i0.id = None
Run Code Online (Sandbox Code Playgroud)

然后你可以修改该对象:

i0.a = 1
i0.b = 2
Run Code Online (Sandbox Code Playgroud)

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

session.add(i0)
session.flush()
Run Code Online (Sandbox Code Playgroud)

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

print i0.id #New ID
Run Code Online (Sandbox Code Playgroud)

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