如何使用SQLAlchemy Core在子查询中插入多个值?

2024-10-03 09:13:42 发布

您现在位置:Python中文网/ 问答频道 /正文

使用sqlalchemycore(而不是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'))

但我似乎只有在对^{}子句使用^{}方法时才能够使用子查询,该子句一次只允许执行一次插入操作。我想一次插入多个值,方法是将它们作为绑定参数列表传递给Connection^{}方法,但这似乎不受支持。在

是否可以在一次调用execute()中执行我想要的操作?在

这是一个独立的演示。注意这使用了sqlite引擎doesn't support multiple inserts in the same way as MySQL,但是SQLAlchemy代码仍然以与实际MySQL应用程序相同的方式失败。在

^{pr2}$

运行它,它会在最后一个execute()调用时终止:

sqlalchemy.exc.InterfaceError: (InterfaceError) Error binding parameter 1 - probably unsupported type. u'INSERT INTO widgets (name, type) VALUES (?, ?)' (('Raspberry', <sqlalchemy.sql.expression.Select at 0x19f14d0; Select object>), ('Lychee', <sqlalchemy.sql.expression.Select at 0x19f1a50; Select object>))


Tags: 方法namefromsqlalchemytypemysqlwidgetswhere
1条回答
网友
1楼 · 发布于 2024-10-03 09:13:42

不需要将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'},
])

相关问题 更多 >