簡體   English   中英

嘗試將數據插入 postgresql 時出現語法錯誤

[英]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插入到名為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不會保存新的(順序)索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM