我使用python 2.7 + Psycopg2 2.6将数据插入Postgresql 9.4数据库,这在一个非常基础的水平上运行良好。创建了一些动态INSERT查询,它们从字典(input_cols
)中获取不同的列和值集:
sql_template = "insert into tbl ({}) values %s"
sql = sql_template.format(', '.join(input_cols.keys()))
params = (tuple(input_cols.values()),)
cur.execute(sql, params)
更正生成的SQL:
insert into tbl (col1, col2, ...) values ('val1', 'val2', ...)
现在,如果不是EXIST查询,现在也想对某些INSERT使用动态SQL生成,但是作为' cur.execute(sql,params)'上面输出一个由'()'包围的值列表我无法让它发挥作用:
sql_template = "insert into tbl ({}) select %s where not exists (select id
from tbl where id = %s)"
sql = sql_template.format(', '.join(input_cols.keys()))
params = (tuple(input_cols.values()), input_cols['col1'])
生成的SQL不正确:
insert into tbl (col1, col2) select ('val1', 'val2')
where not exists (select col1 from tbl where id = 'val1')
如何在没有('val1', 'val2')
的情况下输出()
,以便我可以在SELECT xxx, xxx WHERE NOT EXISTS
查询中使用它?
答案 0 :(得分:0)
使用from (values...
input_cols = {'col1':'val1','col2':'val2'}
sql_template = """
insert into tbl ({})
select *
from (values %s) s
where not exists (
select id
from tbl
where id = %s
)
"""
sql = sql_template.format(', '.join(input_cols.keys()))
params = (tuple(input_cols.values()), input_cols['col1'])
print cursor.mogrify(sql, params)
输出:
insert into tbl (col2, col1)
select *
from (values ('val2', 'val1')) s
where not exists (
select id
from tbl
where id = 'val1'
)