2016-05-28 25 views
1

タプルからループされた値のタプルからpsycopg2のプライマリキーを設定するにはどうすればよいですか?例えばpsycopg2プレースホルダ付きタプルからのプライマリキー

私は私のタプル

meetattrs = ('id', 'venue', 'date', 'rail', 'weather', 'trackcondition') 

を持っているし、私は、テーブルおよび抽出液を作成し、値を挿入します。 meetattrsから私は主キーとしてidを設定したいと思う。

conn = psycopg2.connect("") 
with conn, conn.cursor() as cur: 
     # First, create tables. 
    cur.execute("drop table if exists meetings, races, horses") 
    cur.execute("create table meetings (id integer PRIMARY KEY, " + 
       ", ".join("%s varchar" % fld for fld in meetattrs) 
       + ")") 

これは解決方法がわからないため、このエラーが発生します。

Traceback (most recent call last): 
    File "racemeeting.py", line 56, in <module> 
    + ")") 
psycopg2.ProgrammingError: column "id" specified more than once 

答えて

1

あなたの現在のSQLクエリの後joinが実行され、プレースホルダの値は次のようになります。

'create table meetings (id integer PRIMARY KEY, id varchar, venue varchar, date varchar, rail varchar, weather varchar, trackcondition varchar)' 

idが2回指定されています。

あなたは非常にきれいな方法でクエリを構築することができます。

query_params = " %s integer PRIMARY KEY" + ", %s varchar" * (len(meetattrs) - 1) 

をそして、あなたのSQL文は次のようになります。プレースホルダの値の挿入後

"create table meetings (" + query_params % meetattrs + ")" 

'create table meetings (id integer PRIMARY KEY, venue varchar, date varchar, rail varchar, weather varchar, trackcondition varchar)' 

をしてタプルの最初の項目は常にid

01です。
1

このような問題では、まずSQL文字列を作成して制御する必要があります。

("create table meetings (id integer PRIMARY KEY, " + 
      ", ".join("%s varchar" % fld for fld in meetattrs) 
      + ")") 

ができます:効果的id列を複製

'create table meetings (id integer PRIMARY KEY, id varchar, venue varchar, date varchar, rail varchar, weather varchar, trackconditionvarchar)' 

溶液を、次いで簡単です:meetattrsから最初の識別子を削除します。

cur.execute("create table meetings (id integer PRIMARY KEY, " + 
      ", ".join("%s varchar" % fld for fld in meetattrs[1:]) 
      + ")") 

を代わりに確認できない場合に、主キーの最初の要素の場合:

cur.execute("create table meetings (id integer PRIMARY KEY, " + 
      ", ".join("%s varchar" % fld for fld in meetattrs if fld != 'id') 
      + ")") 
関連する問題