是否有更短的语法使用psycopg2将值插入postgres表?

时间:2012-11-29 00:40:26

标签: python postgresql psycopg2

我正在尝试使用带有Python 2.7的psycopg2将许多列插入到表行中。有没有办法缩短INSERT语法?我目前不得不一遍又一遍地输入占位符(%s),如VALUES(%s,%s,%s,...%s)

编辑: 目前我有

tableCursor.execute('INSERT INTO "table" ("x1","x2","x3","x4")' +
            'VALUES (%s,%s,%s,%s)', (val1,val2,val3,val4))

我想使用的不仅仅是占位符,但是输入%s会有点重复。

2 个答案:

答案 0 :(得分:3)

不。

如果您有足够的列,这是一个问题,那么(a)您可能需要重新考虑您的架构设计,并且(b)您始终可以使用', '.join(['%s']*n) n生成字符串的参数数量。

>>> ', '.join(['%s']*7)
'%s, %s, %s, %s, %s, %s, %s'

>>> 'INSERT INTO tablename(col1,col2,col3,col4,col5,col6,col7) VALUES (' + ', '.join(['%s']*7) + ');'
'INSERT INTO tablename(col1,col2,col3,col4,col5,col6,col7) VALUES (%s, %s, %s, %s, %s, %s, %s);'

我同意如果你没有明确地给出一个列,psycopg根据命名的列数自动推断VALUES列表会很好。但事实并非如此,而且DIY很容易。

答案 1 :(得分:1)

这也有效:

tableCursor.execute('INSERT INTO "table" ("x1","x2","x3","x4")' +
            'VALUES %s', [(val1,val2,val3,val4)])

通过递归调整其参数并放入括号来调整元组,因此它们可以很好地表示IN的记录,复合类型或值列表。