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

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')) 但我似乎只能在对一个子句使用方法时使用子查询

使用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'))
但我似乎只能在对一个子句使用方法时使用子查询,该子句一次只允许我执行一次插入。我想一次插入多个值,将它们作为绑定参数列表传递给
连接的方法,但这似乎不受支持

是否可以在对
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
有两个字段怎么办?