2017-06-06 6 views
0

Python 2.7では、フィーチャのIDをキーに辞書を置きましょう。
何千もの機能があります。
それぞれの機能が単一の値を有するが、この値は機能の6つのパラメータタプルであり、Iは、これらのデータベースにPostgreSQLのテーブルを持っている一方フィーチャのユニークな値としてパラメータを含むタプルをpostgresqlテーブルに書き込む

(例えばサイズ、色、等)機能のパラメータを保存する必要があります。
機能IDは既にテーブルに設定されています(これらの機能に関するその他の情報も)。
IDは一意です(ランダム(シリアルではありませんが、一意の番号)です)。
"param1"、 "param2"、 "param3"、...、 "param6"という名前の6つの空の列があります。
私はすでにこれらの名前を含むタプルを持っている:

columns = ("param1", "param2", "param3", ..., "param6") 

私は機能ごとに、それぞれの列にこれらのパラメータを保存するために動作しません持っているコード:

# "view" is the dictionary with features's ID as keys() 
# and their 6 params stored in values(). 
values = [view[i] for i in view.keys()] 
columns = ("param1","param2","param3","param4","param5","param6") 


conn = psycopg2.connect("dbname=mydb user=username password=password") 
curs = conn.cursor() 

curs.execute("DROP TABLE IF EXISTS mytable;") 
curs.execute("CREATE TABLE IF NOT EXISTS mytable (LIKE originaltable including defaults including constraints including indexes);") 
curs.execute("INSERT INTO mytable SELECT * from originaltable;") 

insertstatmnt = 'INSERT INTO mytable (%s) values %s' 
alterstatement = ('ALTER TABLE mytable '+ 
        'ADD COLUMN param1 text,'+ 
        'ADD COLUMN param2 text,'+ 
        'ADD COLUMN param3 real,'+ 
        'ADD COLUMN param4 text,'+ 
        'ADD COLUMN param5 text,'+ 
        'ADD COLUMN param6 text;' 
       ) 
curs.execute(alterstatement) # It's working up to this point. 
curs.execute(insertstatmnt, (psycopg2.extensions.AsIs(','.join(columns)), tuple(values))) # The problem seems to be here. 

conn.commit() # Making change to DB ! 
curs.close() 
conn.close() 

ここで私が持っているエラーだが:

curs.execute(insert_statement, (psycopg2.extensions.AsIs(','.join(columns)), tuple(values))) 

ProgrammingError: INSERT has more expressions than target columns 

私は何かを欠場する必要があります。
これを正しく行うにはどうすればよいですか?

+0

'print(tuple(values))'何が表示されますか? –

+0

何百MBもの...!簡単に言うと、 'values'は最初は各フィーチャに対して6つのパラメータの6つの値を含むリストです。 6値のプロフィーチャ(数千のフィーチャ)は、リスト内の1つのタプルとして格納されます。タプルの6つの要素のそれぞれは、数字であるものを除いて文字列です。例えば。 :type(values [5617] [type](value [5617] [value] [5617] [value]])は、 5]) ' - >' str'を使用します。他の場所でも 'NoneType'があるかもしれません。 –

答えて

0

「%s」を使用して文を取得したい場合は、いくつか変更する必要があります。 c.executeを無視

()、この文は間違っされるものではないが、それはあなたが探しているものは戻りません。自分のバージョンを使用して、これは私がその声明で得たものです。私はpsycopg2.extensions.AsIs()も無視しました。なぜなら、文字列表現がSQL表現としてすでに有効なのは、ISQLQuoteプロトコルに準拠したアダプタだけです。

>>> values = [ i for i in range(0,5)] #being I dont know the keys, I just made up values. 

>>> insertstatmnt, (','.join(columns), tuple(vlaues)) 
>>> ('INSERT INTO mytable (%s) values %s', ('param1,param2,param3,param4,param5,param6', (0, 1, 2, 3, 4))) 

ご覧のとおり、入力した値は値を含むタプルを返します。

>>> insertstatmnt % (','.join(columns), tuple(values)) 
>>> 'INSERT INTO mytable (param1,param2,param3,param4,param5,param6) values (0, 1, 2, 3, 4)' 

ここで、これはSQLによって読み込まれる可能性が高い文字列を返します。値は明らかに指定された値と一致しません。私はあなたの問題をあなたの文字列を作成する内にあると信じています。 pycopg2ため

参考:私はこのスレッドからpsycopg2コマンドの構文を取ったようhttp://initd.org/psycopg/docs/extensions.html

+0

2番目の引数は 'curs.execute()'として機能しません。2つの入力引数はパーセント記号ではなくカンマで区切ります: 'TypeError:&str 'と' tuple''のサポートされていないオペランドタイプ –

+0

@skパーセント記号は文字列を作成し、どのパッケージが実行されますか?多分私は別の実行を考えている –

0

Insert Python Dictionary using Psycopg2

ととまったく言及した例と同じ構造を(従わない私のvalues辞書この例のようにIDとして1つのキーがありますが、私の6つのパラメータを含むタプルとして1つの対応する値しかありません。したがって、キーに対応する6つの値の代わりに "入れ子になった1つのレバー深い")フィーチャーごとに1つのSQLステートメントを実行するすべてのフィーチャーをループします。

[curs.execute(insertstatmnt, (psycopg2.extensions.AsIs(', '.join(columns)), i)) for i in tuple(values)]. 

これは機能しています。

関連する問題