2

各行が個別の変数テーブルである postgresql データベースに解析済みの dta データを挿入しようとしていますが、2 行目に「recodeid_fk」を追加するまで機能していました。このコードを実行しようとしたときに表示されるエラーは、pg8000.errors.ProgrammingError: ('ERROR', '42601', 'syntax error at or near "imp"')です。

最終的には、複数のファイルを同時に解析し、データをデータベースに挿入できるようにしたいと考えていますが、現在何が起こっているのかを理解してくれる人がいれば、それは素晴らしいことです。私は Python 2.7.5 を使用しています。statareader は pandas 0.12 開発記録からのもので、Python の経験はほとんどありません。

dr = statareader.read_stata('file.dta')
a = 2
t = 1
for t in range(1,10):
    z = str(t)
    for date, row in dr.iterrows():
        cur.execute("INSERT INTO tblv00{} (data, recodeid_fk) VALUES({}, {})".format(z, str(row[a]),29))
    a += 1
    t += 1
conn.commit()
cur.close()
conn.close()
4

1 に答える 1

2

あなたの特定のエラーに...

構文エラーは、おそらく{}引用符で囲む必要がある文字列から発生します。execute()自動的にこれを処理できます。交換

execute("INSERT INTO tblv00{} (data, recodeid_fk) VALUES({}, {})".format(z, str(row[a]),29))

execute("INSERT INTO tblv00{} (data, recodeid_fk) VALUES(%s, %s)".format(z), (row[a],29))

テーブル名は前と同じ方法で完成しますが、値は によって埋められ、execute必要に応じて引用符が挿入されます。テーブルexecute名も入力して、format完全に削除することもできますが、それは通常とは異なる使用法でありexecute、名前の途中に (誤って) 引用符を入れる可能性があると思います。

しかし、もっと良いアプローチがあります...

Pandas には、DataFrame を SQL テーブルに書き込むための関数が含まれています。Postgresql はまだサポートされていませんが、単純なケースでは、sqlite または MySQL データベースに接続していて問題がないふりをすることができるはずです。

ここであなたは何を意図してzいますか?そのまま、次の for ループに進む前にz from '1'toをループします。'9'ループをネストする必要がありますか? つまり、を介してdr呼び出された 9 つの異なるテーブルに内容を挿入するつもりでしたか?tblv001tblv009

異なる部分をdr異なるテーブルに入れるループを意味する場合は、コードのインデントを確認して明確にしてください。

いずれの場合も、上記のリンクで SQL の挿入を処理する必要があります。

編集への応答

tz、およびaが冗長なことをしているようです。どうですか:

import pandas as pd
import string

...

# Loop through columns of dr, and count them as we go.
for i, col in enumerate(dr):
    table_name = 'tblv' + string.zfill(i, 3) # e.g., tblv001 or tblv010
    df1 = DataFrame(dr[col]).reset_index()
    df1.columns = ['data', 'recodeid_fk']
    pd.io.sql.write_frame(df1, table_name, conn)

以前reset_indexはインデックスを列にしていました。新しい (シーケンシャル) インデックスは によって保存されませんwrite_frame

于 2013-07-08T16:01:11.913 に答える