如何在postgresql中创建动态插入(没有列和值不同)

时间:2017-01-26 11:02:36

标签: python postgresql dynamic insert psycopg2

我使用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查询中使用它?

1 个答案:

答案 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'
)