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


问题内容

我试图将已解析的dta数据插入到postgresql数据库中,每一行都是一个单独的变量表,并且在我添加第二行“
recodeid_fk”之前,它一直有效。我现在在尝试运行此代码时遇到 的错误 是:
pg8000.errors.ProgrammingError:(“错误”,“ 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()

问题答案:

对于您的特定错误…

语法错误可能来自{}需要用引号引起来的字符串。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这里做什么?由于它是从,你循环ž'1''9'进行下一个for循环之前。循环应该嵌套吗?也就是说,您的意思是将内容dr插入tblv001通过9个不同的表进行调用tblv009吗?

如果您希望通过循环将不同部分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