[英]Syntax error when parsing .dta files and attempting to move it to a postgresql server
[英]syntax error when attempting to insert data into postgresql
我試圖將解析的 dta 數據插入到 postgresql 數據庫中,每一行都是一個單獨的變量表,它一直在工作,直到我在第二行中添加“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()
對於您的特定錯誤...
語法錯誤可能來自需要用引號括起來的字符串{}
。 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 包含一個將 DataFrames 寫入 SQL 表的函數。 Postgresql 尚不支持,但在簡單的情況下,您應該能夠假裝您已連接到 sqlite 或 MySQL 數據庫並且沒有問題。
你對z
意圖是什么? 實際上,在繼續下一個 for 循環之前,您將 z 從'1'
循環到'9'
。 循環應該嵌套嗎? 也就是說,您的意思是將內容dr
插入到名為tblv001
到tblv009
九個不同表中嗎?
如果您的意思是循環將dr
不同部分放入不同的表中,請檢查代碼的縮進並澄清它。
在任何一種情況下,上面的鏈接都應該處理 SQL 插入。
對編輯的回應
似乎t
、 z
和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
不會保存新的(順序)索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.