2013-07-08 186 views
2

我试图将解析后的dta数据插入到postgresql数据库中,每行都是一个单独的变量表,它一直在工作,直到我在第二行“recodeid_fk”中添加为止。尝试运行此代码时出现的错误是:pg8000.errors.ProgrammingError :('ERROR','42601','语法错误处于或接近“imp”')。最终,我希望能够同时解析多个文件,并将数据插入到数据库中,但如果有人能够帮助我理解现在正在发生的事情,那就太棒了。我使用Python 2.7.5,statareader来自熊猫0.12的开发记录,而我在Python方面的经验很少。尝试向postgresql中插入数据时出现语法错误

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() 
+0

**绝对不要像这样直接将值插入到SQL中,否则您会严重伤害[SQL注入](bobby-tables.com)。另外,将来请在问题中提及您的PostgreSQL版本。谢谢! –

+1

另外,无论什么时候你看到自己在循环中用SQL来做什么,都会想“我怎样才能把它变成一个集合操作”。在这种情况下,我建议通过Psycopg2的“COPY”支持使用“COPY”命令从发生器一次性批量插入行。 –

回答

2

您的特定错误...

的语法错误可能来自那些需要他们周围的引号中的字符串{}。​​可以为您自动处理此问题。更换

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在这里?实际上,在继续执行下一个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保存。

+0

只是编辑我的代码,以澄清你的问题。我确实打算将dr的不同部分放入单独的表格中 – bhg23442

相关问题