Python 在SQLAlchemy中,如何正确使用insert().from_select()构造?
我试图创建一个简单的函数来呈现包含(dest_列,src_表达式)对的dict 特别是,我希望界面类似于:Python 在SQLAlchemy中,如何正确使用insert().from_select()构造?,python,sql,insert,sqlalchemy,Python,Sql,Insert,Sqlalchemy,我试图创建一个简单的函数来呈现包含(dest_列,src_表达式)对的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
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的列的顺序似乎被忽略
这就是我所经历的:
小虫
输出
预期
如您所见,INSERT INTO语句中列名的顺序与SELECT语句中表达式的顺序不匹配
我是否误解了.from_select()的预期用途?问题是当您将
定义到\u表中时,如下所示:
sa.Table('table_a', md, *[sa.Column(x, sa.String) for x in cols])
cols列表未排序,因此对于此列表,完全正确的做法是:
cols = ['aaaa', 'bbbb', 'dddd', 'eeee', 'ffff', 'aardvark']
插入SQL是:
INSERT INTO table_a (aaaa, bbbb, dddd, eeee, ffff, aardvark)
在函数中,您使用sorted()
对列进行排序,因此您还必须对cols
列表进行排序。只需在定义后添加cols.sort()
在此之后,插入SQL应为:
INSERT INTO table_a (aaaa, aardvark, bbbb, dddd, eeee, ffff)
正如zzzeek提到的,这是SQLAlchemy<0.8.4中的一个bug
但这迫使我知道SELECT语句中的顺序,我觉得这是一个错误。我可以修改_insert_到_dict中,以内省表的列顺序并修改select()顺序,但这似乎很奇怪。我正在将一个有序列表传递到.from_select,但它忽略了其中的顺序。doc甚至暗示names参数的顺序很重要:“.from子句返回的列的顺序应与作为names参数发送的列的顺序相对应;”是的,这是有文档记录的,选中此项:,在parameters=>select中,这意味着您应该注意顺序。不,它说的是相反的:“此from子句返回的列顺序应与作为names参数发送的列顺序相对应;“。换句话说,我传递给两者的顺序可以是任意的,只要名称参数和选择列参数中的顺序匹配。请注意,表列的顺序从未提及,只有选择的顺序和名称参数的顺序。让我试试看,您运行的是哪个版本的sqla?这个问题是h截至已修复。修复适用于0.8.5和0.9.0。
cols = ['aaaa', 'bbbb', 'dddd', 'eeee', 'ffff', 'aardvark']
INSERT INTO table_a (aaaa, bbbb, dddd, eeee, ffff, aardvark)
INSERT INTO table_a (aaaa, aardvark, bbbb, dddd, eeee, ffff)