【发布时间】:2011-12-22 06:18:11
【问题描述】:
使用 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() 子句使用 values() 方法时使用子查询,该子句只允许我一次插入一个。我想一次插入多个值,方法是将它们全部传递给Connection 的execute() 方法作为绑定参数列表,但这似乎不受支持。
是否可以在一次调用 execute() 时完成我想做的事情?
这是一个独立的演示。请注意,这使用了doesn't support multiple inserts in the same way as MySQL 的 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'INSERT INTO 小部件(名称, type) VALUES (?, ?)' (('Raspberry',
), ('荔枝', ))
【问题讨论】:
-
我有一种直觉,你做错了 - 目前你想为每条记录执行一个子查询。而且因为您使用的是 SQLAlchemy Core,这意味着所有 SQL 都将完全按照您提供的方式执行。
-
@plaes 是的,这正是我想要做的(对每条记录执行一个子查询),你只需要相信我,它在实际应用程序
:)中更有意义。但问题是 SQLAlchemy 没有完全执行我提供的内容,并且拒绝处理Select表达式:(
标签: python sqlalchemy