2

我正在尝试将解析的 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()
4

1 回答 1

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可能(错误地)在名称中间加上引号。

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

Pandas 包含一个用于将 DataFrame 写入 SQL 表的函数。尚不支持 Postgresql,但在简单的情况下,您应该能够假装连接到 sqlite 或 MySQL 数据库并且没有问题。

你打算在z这里做什么?实际上,在进行下一个 for 循环之前,您将 z 从'1'to循环。'9'循环应该嵌套吗?也就是说,您的意思是将内容插入到调用through的dr九个不同的表中吗?tblv001tblv009

如果您的意思是循环将不同部分dr放入不同的表中,请检查代码的缩进并澄清它。

无论哪种情况,上面的链接都应该处理 SQL 插入。

对编辑的回应

似乎t,za正在做多余的事情。怎么样:

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

于 2013-07-08T16:01:11.913 回答