Python 如何为postgresql创建不存在的动态插入(列数和值数不同)

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

我使用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 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!