python - 尝试将数据插入 postgresql 时出现语法错误

标签 python postgresql pandas

我正在尝试将解析的 dta 数据插入到 postgresql 数据库中,每一行都是一个单独的变量表,并且它一直在工作,直到我在第二行中添加“recodeid_fk”。我在尝试运行此代码时遇到的错误是:pg8000.errors.ProgrammingError: ('ERROR', '42601', 'syntax error at or close "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 包括 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 不会保存新的(顺序)索引。

关于python - 尝试将数据插入 postgresql 时出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530563/

相关文章:

PostgreSQL:警告:控制台代码页 (437) 与 Windows 代码页 (1252) 不同

python - 如何修改 pandas 数据框中混合数据类型列中的数值?

python - 根据 bool 条件在新列中设置值

python pandas数据框按日期条件切片

Python IMAP 搜索部分主题

PostgreSQL、WAMP、Laravel 5.5 - "php artisan migrate"抛出 "driver not found"异常

python - 如何在列中的每个不同值上拆分 DataFrame?

python - Pillow 已安装,但仍收到 "ImportError: No module named PIL"

python - 将 2 个相同的 pandas 数据框加入多级行键

python - TimeoutError : QueuePool limit of size 5 overflow 10 reached, 连接超时,超时30