python psycopg2条件插入语句
我需要编写一个INSERT语句,首先检查数据是否已经存在。当前代码位于python内部,使用psycopg2连接到postgresql数据库:python psycopg2条件插入语句,python,sql,postgresql,psycopg2,Python,Sql,Postgresql,Psycopg2,我需要编写一个INSERT语句,首先检查数据是否已经存在。当前代码位于python内部,使用psycopg2连接到postgresql数据库: sql = """IF NOT EXISTS (SELECT * FROM table \ WHERE col_1 = (%s) AND col_2 = (%s) ) \ INSERT INTO table (col1, col2) \ VALUES (%s, %s);"""
sql = """IF NOT EXISTS (SELECT * FROM table \
WHERE col_1 = (%s) AND col_2 = (%s) ) \
INSERT INTO table (col1, col2) \
VALUES (%s, %s);"""
data = ( col1_data, col2_data, col1_data, col2_data)
try:
CURSOR.execute(sql, data)
DB.commit()
except:
print "Cursor failed INSERT INTO table.\n"
这不起作用(而且我没有做过质量错误处理,所以我没有得到任何好的信息)。
因此,我进入psql并尝试:
IF NOT EXISTS (SELECT * FROM t WHERE c1=d1 AND c2=d2)
INSERT INTO t (c1, c2) VALUES (d1,d2);
我得到了以下错误:
ERROR: syntax error at or near "IF"
LINE 1: IF NOT EXISTS (SELECT * FROM table WHERE c1 = d1...
^
因此,我相信我的错误在sql中,而不是python中(尽管我可能是错的),因为这是可行的:
sql = """INSERT INTO t2 (col_0, col_1, col_2) \
VALUES (%s, %s, %s);"""
data = (d1, d2, time.time())
try:
CURSOR.execute(sql, data)
DB.commit()
except:
print "Cursor failed to INSERT INTO t2.\n"
对于表1,我的创建是:
db=> CREATE TABLE table (
col_0 SERIAL PRIMARY KEY,
col_1 varchar(16),
col_2 smallint
);
NOTICE: CREATE TABLE will create implicit sequence "pm_table_ip_id_seq" for serial column "pm_table.ip_id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "pm_table_pkey" for table "pm_table"
CREATE TABLE
我非常感谢任何帮助和指导。我在我的项目中使用了这样的要求
insert_function = """
CREATE LANGUAGE plpgsql;
CREATE FUNCTION insert_if_unique (sql_insert TEXT)
RETURNS VOID
LANGUAGE plpgsql
AS $$
BEGIN
EXECUTE sql_insert;
RETURN;
EXCEPTION WHEN unique_violation THEN
RETURN;
-- do nothing
END;
$$;
"""
cursor.execute(insert_function);
您可以使用以下内容来使用它:
cursor.execute("insert_if_unique("+sql+")"%data)
上述查询未参数化。因此,如果您从外部源获取输入,请小心SQL注入
注意:您可以使用cursor.mogrify()
规避SQL注入攻击
sql = cursor.mogrify(sql,data)
cursor.execute("insert_if_unique("+sql+")")
试着把这些倒过来。不存在子查询的条件:
INSERT INTO t (c1, c2) VALUES (d1,d2)
WHERE NOT EXISTS (SELECT * FROM t WHERE c1=d1 AND c2=d2)
您确定这两列不能组成主键吗?