使用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'))
Run Code Online (Sandbox Code Playgroud)
但是我values()在一个insert()只允许我一次插入一个子句的子句上使用该方法时似乎只能使用子查询.我想用他们全部传递给在一次插入多个值Connection的execute()方法的绑定参数列表,但是这似乎并没有得到支持.
有可能在一次通话中做我想做的事execute()吗?
这是一个独立的演示.请注意,这使用sqlite引擎,它不像MySQL那样支持多次插入,但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},
)
Run Code Online (Sandbox Code Playgroud)
运行它,它在最后一次execute()调用时死亡:
sqlalchemy.exc.InterfaceError:(InterfaceError)绑定参数1的错误 - 可能是不支持的类型.u'INSERT INTO小部件(名称,类型)VALUES(?,?)'(('Raspberry',<sqlalchemy.sql.expression.Select at 0x19f14d0; Select object>),('Lychee',<sqlalchemy.sql.expression .选择0x19f1a50;选择对象>))
您必须将其嵌入到INSERT语句中,而不是将subselect语句作为参数值提供:
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'},
])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3704 次 |
| 最近记录: |