Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在SQLAlchemy中,如何正确使用insert().from_select()构造?_Python_Sql_Insert_Sqlalchemy - Fatal编程技术网

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

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

我试图创建一个简单的函数来呈现包含(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功能的一些特殊行为,即传递给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)