2012-03-27 15 views
2

データがすでに存在するかどうかを最初に確認するINSERTステートメントを記述する必要があります。現在のコードは、PostgreSQLのDBに接続するためにpsycopg2を使用してのpythonの内側にある:python psycopg2条件付き挿入ステートメント

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のために、私のCREATEました:

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 

私は何か助けと指導に感謝します。

+1

これらの2つの列はプライマリキーを構成できませんか? –

答えて

1

私はあなたがそれを使用するには、以下のようなものを使用することができます私のプロジェクトでは、このような要件

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); 

ためplpgsqlを使用:

cursor.execute("insert_if_unique("+sql+")"%data) 

上記のクエリがパラメータ化されていません。したがって、外部ソースから入力を取得する場合は、SQLインジェクションに注意してください。

cursor.mogrify()を使用すると、SQLインジェクション攻撃を回避できます。

sql = cursor.mogrify(sql,data) 
cursor.execute("insert_if_unique("+sql+")") 
0

逆にしてください。サブクエリで存在しない条件:サブタイプ:

INSERT INTO t (c1, c2) VALUES (d1,d2) 
WHERE NOT EXISTS (SELECT * FROM t WHERE c1=d1 AND c2=d2) 
関連する問題