在SQLAlchemy中,如何正确使用insert().from_select()构造?

2024-06-16 09:29:08 发布

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

我试图创建一个简单的函数来呈现包含(dest_column,src_expression)对的dict。在

特别是,我希望界面类似于:

insert_into(table_obj_a, tbl_object_b, dict(
    col_c = 'col_f',
    col_a = 'col_g',
    col_q = 'col_r + 5',
    col_r = tbl_object_b.col_q,
    col_m = 'rand()',
))

在尝试实现这一点时,我注意到.from_select功能有一些特殊的行为,即传递给from_select的列的顺序似乎被忽略了。在

这就是我所经历的:

在虫子.py在

^{pr2}$

输出

u@host:~/src/sa_bug$ python bug.py
['aaaa', 'aardvark', 'bbbb', 'dddd', 'eeee', 'ffff']
['aaaa', 'aardvark', 'bbbb', 'dddd', 'eeee', 'ffff']
SELECT aaaa, aardvark, bbbb, dddd, eeee, ffff
FROM table_b

INSERT INTO table_a (aaaa, bbbb, dddd, eeee, ffff, aardvark) SELECT aaaa, aardvark, bbbb, dddd, eeee, ffff
FROM table_b

期望

u@host:~/src/sa_bug$ python bug.py
['aaaa', 'aardvark', 'bbbb', 'dddd', 'eeee', 'ffff']
['aaaa', 'aardvark', 'bbbb', 'dddd', 'eeee', 'ffff']
SELECT aaaa, aardvark, bbbb, dddd, eeee, ffff
FROM table_b

INSERT INTO table_a (aaaa, aardvark, bbbb, dddd, eeee, ffff) SELECT aaaa, aardvark, bbbb, dddd, eeee, ffff
FROM table_b

如您所见,INSERT INTO语句中列名的顺序与SELECT语句中表达式的顺序不匹配。在

我是否误解了.from峎select()的预期用途?在


Tags: fromsrc顺序tablecolselectbugaaaa
2条回答

问题是当您像这样定义into_table时:

sa.Table('table_a', md, *[sa.Column(x, sa.String) for x in cols])

cols列表未排序,因此对于该列表:

^{pr2}$

INSERT SQL是:

INSERT INTO table_a (aaaa, bbbb, dddd, eeee, ffff, aardvark)

在函数内部,您使用sorted()column_dict进行排序,因此还必须对cols列表进行排序。只需尝试在您的cols定义之后添加cols.sort()。在

之后,INSERT SQL应该是:

INSERT INTO table_a (aaaa, aardvark, bbbb, dddd, eeee, ffff)

正如zzzeek提到的,这是SQLAlchemy<;0.8.4中的一个bug。在

http://www.sqlalchemy.org/trac/ticket/2895

相关问题 更多 >