0

.dta ファイルを解析し、各行を個別のテーブルに入力しようとしています。.dta ファイルはさまざまな変数で構成されており、各変数を個別の「変数テーブル」に挿入したいと考えています。pandas の新しい .dta リーダーを使用しています。これは statareader という名前です。私は Python の経験があまりないので、構文について少し助けてくれることを望んでいました。また、私はpython 2.7.5を使用しています

a = 2
t = 1
while t >= 1:
    for date, row in dr.iterrows():
        cur.execute("INSERT INTO (table#'+str(t)') (data) VALUES(%s)" % (row[a]))
    t+=1
    a+=1
    if t == 10:
        break

cur.execute 行で、次のエラーが表示されます。

pg8000.errors.ProgrammingError: ('ERROR', '42601', 'syntax error at or near "("')

私が間違っていることについてのアイデアはありますか?

4

1 に答える 1

1

無効な SQL コードを生成しています。ステートメントでは、テーブル名を括弧で囲むINSERTことはできません。()テーブル名を引用するには (大文字と小文字が区別されるので注意してください)、二重引用符で囲みます。

cur.execute('INSERT INTO "table#{}" (data) VALUES (%s)'.format(t), (row[a],))

上記の例では、行データに適切な SQL パラメータも使用しています。通常、データベースに一般的なステートメントを準備させ、挿入ごとに準備されたステートメントを再利用させます。SQL パラメーターを使用することrow[a]で、適切にエスケープされるだけでなく、データベースにジェネリック ステートメントを準備させることもできます。pg8000 のデフォルトの paramstyle 形式を使用しました。

おそらく、whileループ条件を再考する必要があります。t < 10代わりにifをテストしてみませんか?

a = 2
t = 1
while t < 10:
    for date, row in dr.iterrows():
        cur.execute('INSERT INTO "table#{}" (data) VALUES (%s)'.format(t), (row[a],))
    a += 1
    t += 1

または、代わりにPythonforループを使用します。range()

for t in range(1, 10):
    a = t + 1
    for date, row in dr.iterrows():
        cur.execute('INSERT INTO "table#{}" (data) VALUES (%s)'.format(t), (row[a],))
于 2013-07-02T13:14:59.560 に答える