【问题标题】:syntax error when attempting to insert data into postgresql尝试将数据插入 postgresql 时出现语法错误
【发布时间】:2013-07-08 15:34:54
【问题描述】:

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

【问题讨论】:

  • 永远不要像这样将值直接插入到 SQL 中,你会让自己非常容易受到 [SQL 注入](bobby-tables.com) 的攻击。此外,将来请在问题中提及您的 PostgreSQL 版本。谢谢!
  • 另外,每当你看到自己在循环中使用 SQL 做某事时,想想“我怎样才能把它变成一个集合操作”。在这种情况下,我建议通过 Psycopg2 的 COPY 支持使用 COPY 命令从生成器一次性批量插入行。

标签: python postgresql pandas


【解决方案1】:

针对您的具体错误...

语法错误可能来自需要引号的字符串{}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 包括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 不会保存新的(顺序)索引。

【讨论】:

  • 刚刚编辑了我的代码以澄清您的问题。我确实打算将 dr 的不同部分循环到单独的表中
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2020-11-25
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多