【问题标题】:There is a column named "column" in table "table", but it cannot be referenced from this part of the query表“table”中有一个名为“column”的列,但不能从这部分查询中引用
【发布时间】:2016-06-19 22:45:35
【问题描述】:

所以我尝试使用 for 循环将 python 字典中的数据输入到 postgres 数据库中。代码如下

for value in dic:
    domain_desc = value["domain_desc"]
    commodity_desc = value["commodity_desc"]
    statisticcat_desc = value["statisticcat_desc"]
    agg_level_desc = value["agg_level_desc"]
    country_name = value["country_name"]
    state_name = value["state_name"]
    county_name = value["county_name"]
    unit_desc = value["unit_desc"]
    value1 = value["Value"]
    year_val = value["year"]
    cur.execute("INSERT INTO fact_data (domain_desc,commodity_desc,statisticcat_desc,agg_level_desc,country_name,state_name,county_name,unit_desc,value,year) VALUES (domain_desc,commodity_desc,statisticcat_desc,agg_level_desc,country_name,state_name,county_name,unit_desc,value1,year_val)")
    cur.commit()
    print("Success!")

我不断收到错误

Traceback(最近一次调用最后一次): 文件“C:/Users/Backup/PycharmProjects/gro-app/harvest.py”,第 123 行,在 cur.execute("INSERT INTO fact_data (domain_desc,commodity_desc,statisticcat_desc,agg_level_desc,country_name,state_name,county_name,unit_desc,value,year) VALUES (domain_desc,commodity_desc,statisticcat_desc,agg_level_desc,country_name,state_name,county_name,unit_desc,value1,year_val )") psycopg2.ProgrammingError:列“domain_desc”不存在 第 1 行:...te_name,county_name,unit_desc,value,year) VALUES (domain_des... ^ 提示:“fact_data”表中有一个名为“domain_desc”的列,但不能从这部分查询中引用它。

我将数据库和表放在正确的位置。是什么导致了这个错误?我发现了一个类似的问题,但我不理解错误及其在不同的上下文中 有人帮我理解这一点

【问题讨论】:

  • VALUES 之后,您必须再次提供实际值而不是列名。
  • 这些是变量名
  • 写入字符串时不会。阅读initd.org/psycopg/docs/usage.html#query-parameters 了解如何传递变量。
  • @KlausD。谢谢那有效..我没有正确传递变量

标签: python postgresql


【解决方案1】:

我认为您需要在值内添加变量,并使用 + 连接字符串:

cur.execute("INSERT INTO fact_data (domain_desc,commodity_desc,statisticcat_desc,agg_level_desc,country_name,state_name,county_name,unit_desc,value,year) VALUES (" + ', '.join(map(str, (domain_desc,commodity_desc,statisticcat_desc,agg_level_desc,country_name,state_name,county_name,unit_desc,value1,year_val))) + ")")

考虑使用 map 从变量中创建字符串,join 以将它们连接成一个长字符串。

我什至建议你分开做,以使其更具可读性:

dict_value = ', '.join(map(str, (domain_desc,commodity_desc,statisticcat_desc,agg_level_desc,country_name,state_name,county_name,unit_desc,value1,year_val)))

cur.execute("INSERT INTO fact_data (domain_desc,commodity_desc,statisticcat_desc,agg_level_desc,country_name,state_name,county_name,unit_desc,value,year) VALUES (" + dict_value + ")"

【讨论】:

  • 这种方法容易受到 SQL 注入的攻击,不要这样做!
  • 取决于这些变量的来源。如果之前检查过这个字典,那就没问题了。总的来说,我同意,将变量设置为 DB 之前没有检查它们存在很大的安全问题,但这不是问题所在。
  • 对不起,这不起作用,克劳斯D。在我的问题中发表评论有帮助
猜你喜欢
  • 2021-12-25
  • 2014-08-08
  • 2018-11-17
  • 2019-11-04
  • 2015-07-13
  • 2019-01-14
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多