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

Python 我可以基于SQLAlchemy中的另一个数据库行添加新项吗?,python,mysql,sqlalchemy,flask-sqlalchemy,Python,Mysql,Sqlalchemy,Flask Sqlalchemy,正如标题所示,我想添加一行,其id基于SQLALchemy中的另一行。目前,我正在添加一个额外的select,但我想去掉这个。我知道这在MySQL中是可能的,所以我只是想找出SQLAlchemy版本。以下是我目前拥有的: keywords = ['a', 'b', 'c'] prefix_id = session.query(Prefix.id)\ .filter_by(name=some_prefix).first()[0] inventory_item = InventoryItem

正如标题所示,我想添加一行,其id基于SQLALchemy中的另一行。目前,我正在添加一个额外的
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添加更多项目,因此我希望在一个事务中尽可能高效地完成所有工作。

如果要复制的对象是
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。

这如何回答我的问题?我不想复制任何对象。看看这个:它可能会给你一些想法。