Python 如何为postgresql创建不存在的动态插入(列数和值数不同)
我使用Python2.7+Psycopg2.6将数据插入到Postgresql 9.4数据库中,该数据库在非常基本的级别上运行良好。创建了一些动态插入查询,这些查询从字典中获取不同的列和值集(Python 如何为postgresql创建不存在的动态插入(列数和值数不同),python,postgresql,dynamic,insert,psycopg2,Python,Postgresql,Dynamic,Insert,Psycopg2,我使用Python2.7+Psycopg2.6将数据插入到Postgresql 9.4数据库中,该数据库在非常基本的级别上运行良好。创建了一些动态插入查询,这些查询从字典中获取不同的列和值集(input\u cols): 生成了正确的SQL语句: insert into tbl (col1, col2, ...) values ('val1', 'val2', ...) insert into tbl (col1, col2) select ('val1', 'val2') where no
input\u cols
):
生成了正确的SQL语句:
insert into tbl (col1, col2, ...) values ('val1', 'val2', ...)
insert into tbl (col1, col2) select ('val1', 'val2')
where not exists (select col1 from tbl where id = 'val1')
现在,我还想对一些不存在的插入查询使用动态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, ...) values ('val1', 'val2', ...)
insert into tbl (col1, col2) select ('val1', 'val2')
where not exists (select col1 from tbl where id = 'val1')
如何在没有()
的情况下输出('val1','val2')
,以便在选择xxx,xxx(不存在的地方)查询中使用它?使用来自(值…
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'
)
太好了:-)非常感谢你,Clodoaldo Neto!