0

我正在尝试解析 .dta 文件并将每一行输入到单独的表中。.dta 文件由许多不同的变量组成,我想将每个变量插入一个单独的“变量表”。我正在使用 pandas 的新 .dta 阅读器,名为 statareader。我对python没有很多经验,希望对我的语法有一点帮助。我也在使用 python 2.7.5

a = 2
t = 1
while t >= 1:
    for date, row in dr.iterrows():
        cur.execute("INSERT INTO (table#'+str(t)') (data) VALUES(%s)" % (row[a]))
    t+=1
    a+=1
    if t == 10:
        break

在 cur.execute 行,我收到错误:

pg8000.errors.ProgrammingError: ('ERROR', '42601', 'syntax error at or near "("')

关于我做错了什么的任何想法?

4

1 回答 1

1

您正在生成无效的 SQL 代码。INSERT语句不接受()表名周围的括号。引用一个表名(这使它区分大小写,所以要小心)在它周围加上双引号:

cur.execute('INSERT INTO "table#{}" (data) VALUES (%s)'.format(t), (row[a],))

上面的示例还为行数据使用了适当的 SQL 参数;您通常希望让数据库准备一个通用语句并为每个插入重用准备好的语句。通过使用 SQL 参数,您不仅可以确保row[a]正确转义,还可以让数据库准备通用语句。我使用了pg8000 的默认 paramstyle 格式

你可能想重新考虑你的while循环条件;为什么不测试 ift < 10呢?

a = 2
t = 1
while t < 10:
    for date, row in dr.iterrows():
        cur.execute('INSERT INTO "table#{}" (data) VALUES (%s)'.format(t), (row[a],))
    a += 1
    t += 1

或使用 pythonfor循环range()代替:

for t in range(1, 10):
    a = t + 1
    for date, row in dr.iterrows():
        cur.execute('INSERT INTO "table#{}" (data) VALUES (%s)'.format(t), (row[a],))
于 2013-07-02T13:14:59.560 回答