尝试将数据插入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的插入。
回应编辑
看起来像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
。