Python 如何使用SQLAlchemy Core在子查询中插入多个值?
使用SQLAlchemy Core(不是ORM),我尝试在值中使用子查询插入多行。对于MySQL,实际的SQL如下所示:Python 如何使用SQLAlchemy Core在子查询中插入多个值?,python,sqlalchemy,Python,Sqlalchemy,使用SQLAlchemy Core(不是ORM),我尝试在值中使用子查询插入多行。对于MySQL,实际的SQL如下所示: INSERT INTO widgets (name, type) VALUES ('Melon', (SELECT type FROM widgetTypes WHERE type='Squidgy')), ('Durian', (SELECT type FROM widgetTypes WHERE type='Spiky')) 但我似乎只能在对一个子句使用方法时使用子查询
INSERT INTO widgets (name, type) VALUES
('Melon', (SELECT type FROM widgetTypes WHERE type='Squidgy')),
('Durian', (SELECT type FROM widgetTypes WHERE type='Spiky'))
但我似乎只能在对一个子句使用方法时使用子查询,该子句一次只允许我执行一次插入。我想一次插入多个值,将它们作为绑定参数列表传递给连接的方法,但这似乎不受支持
是否可以在对execute()
的单个调用中执行我想要的操作
这是一个独立的演示。注意,这使用了sqlite引擎,但是SQLAlchemy代码仍然以与真正的MySQL应用相同的方式失败
from sqlalchemy import *
if __name__ == "__main__":
# Construct database
metadata = MetaData()
widgetTypes = Table('widgetTypes', metadata,
Column('id', INTEGER(), primary_key=True),
Column('type', VARCHAR(), nullable=False),
)
widgets = Table('widgets', metadata,
Column('id', INTEGER(), primary_key=True),
Column('name', VARCHAR(), nullable=False),
Column('type', INTEGER(), nullable=False),
ForeignKeyConstraint(['type'], ['widgetTypes.id']),
)
engine = create_engine("sqlite://")
metadata.create_all(engine)
# Connect and populate db for testing
conn = engine.connect()
conn.execute(widgetTypes.insert(), [
{'type': 'Spiky'},
{'type': 'Squidgy'},
])
# Some select queries for later use.
select_squidgy_id = select([widgetTypes.c.id]).where(
widgetTypes.c['type']=='Squidgy'
).limit(1)
select_spiky_id = select([widgetTypes.c.id]).where(
widgetTypes.c['type']=='Squidgy'
).limit(1)
# One at a time works via values()
conn.execute(widgets.insert().values(
{'name': 'Tomato', 'type': select_squidgy_id},
))
# And multiple values work if we avoid subqueries
conn.execute(
widgets.insert(),
{'name': 'Melon', 'type': 2},
{'name': 'Durian', 'type': 1},
)
# Check above inserts did actually work
print conn.execute(widgets.select()).fetchall()
# But attempting to insert many at once with subqueries does not work.
conn.execute(
widgets.insert(),
{'name': 'Raspberry', 'type': select_squidgy_id},
{'name': 'Lychee', 'type': select_spiky_id},
)
运行它,在最后一次execute()
sqlalchemy.exc.InterfaceError:(InterfaceError)错误绑定
参数1-可能是不支持的类型。u'插入小部件(名称,
类型)值(?,)((‘树莓’,),(‘荔枝’,),
))
您必须将subselect语句嵌入INSERT语句,而不是将其作为参数值提供:
type_select = select([widgetTypes.c.id]).where(
widgetTypes.c.type==bindparam('type_name'))
insert = widgets.insert({'type': type_select})
conn.execute(insert, [
{'name': 'Melon', 'type_name': 'Squidgy'},
{'name': 'Lychee', 'type_name': 'Spiky'},
])
我有一种直觉,你做错了——目前你想对每一条记录执行一个子查询。因为您使用的是SQLAlchemy Core,这意味着所有SQL都将按照您提供的方式执行。@plaes是的,这正是我想要做的(为每个记录执行子查询),您只需相信我,它在实际应用程序中更有意义:)
。但问题是SQLAlchemy没有完全执行我提供的内容,并且拒绝处理Select
表达式:(
这真是太棒了,谢谢。省去了我多次往返数据库的麻烦-我现在可以在一个查询中完成所有事情,这在数据库位于世界另一端时节省了很多时间。如果键入\u select
有两个字段怎么办?