2013-07-08 244 views
2

我試圖將解析後的dta數據插入到postgresql數據庫中,每行都是一個單獨的變量表,它一直在工作,直到我在第二行「recodeid_fk」中添加爲止。嘗試運行此代碼時出現的錯誤是:pg8000.errors.ProgrammingError :('ERROR','42601','語法錯誤處於或接近「imp」')。最終,我希望能夠同時解析多個文件,並將數據插入到數據庫中,但如果有人能夠幫助我理解現在正在發生的事情,那就太棒了。我使用Python 2.7.5,statareader來自熊貓0.12的開發記錄,而我在Python方面的經驗很少。嘗試向postgresql中插入數據時出現語法錯誤

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() 
+0

**絕對不要像這樣直接將值插入到SQL中,否則您會嚴重傷害[SQL注入](bobby-tables.com)。另外,將來請在問題中提及您的PostgreSQL版本。謝謝! –

+1

另外,無論什麼時候你看到自己在循環中用SQL來做什麼,都會想「我怎樣才能把它變成一個集合操作」。在這種情況下,我建議通過Psycopg2的「COPY」支持使用「COPY」命令從發生器一次性批量插入行。 –

回答

2

您的特定錯誤...

的語法錯誤可能來自那些需要他們周圍的引號中的字符串{}。​​可以爲您自動處理此問題。更換

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可能(錯誤地)在名稱中間加上引號。

但有一個更好的辦法...

大熊貓包括a function for writing DataFrames to SQL tables。 Postgresql尚不支持,但在簡單的情況下,你應該能夠假裝你連接到sqlite或MySQL數據庫,並沒有任何問題。

你打算用z在這裏?實際上,在繼續執行下一個for循環之前,將z從'1'循環到'9'。循環是否應該嵌套?也就是說,你的意思是將dr的內容插入九個不同的表中,稱爲tblv001tblv009

如果您的意思是將dr的不同部分放入不同表格的循環中,請檢查代碼的縮進並澄清它。

無論在哪種情況下,上面的鏈接都應該關注SQL插入。

響應編輯

好像tza正在做的事情冗餘。如何:

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保存。

+0

只是編輯我的代碼,以澄清你的問題。我確實打算將dr的不同部分放入單獨的表格中 – bhg23442

相關問題