尝试将数据插入postgresql时出现语法错误

时间:2013-07-08 15:34:54

标签: python postgresql pandas

我正在尝试将已解析的dta数据插入到postgresql数据库中,每行都是一个单独的变量表,它一直工作,直到我在第二行“recodeid_fk”中添加。我在尝试运行此代码时遇到的错误是: pg8000.errors.ProgrammingError :('ERROR','42601','语法错误在或附近“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()

1 个答案:

答案 0 :(得分: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可能(错误地)放入引号这个名字的中间部分。

但是有更好的方法......

熊猫包括a function for writing DataFrames to SQL tables。目前还不支持Postgresql,但在简单的情况下,您应该可以假装已连接到sqlite或MySQL数据库,并且没有任何问题。

您对此z有什么打算?实际上,您将z从'1'循环到'9',然后继续进行下一个for循环。循环应该嵌套吗?也就是说,您的意思是将内容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保存。