Python 有一列名为;栏「;在表中;表";,但不能从查询的这一部分引用它

Python 有一列名为;栏「;在表中;表";,但不能从查询的这一部分引用它,python,postgresql,Python,Postgresql,因此,我试图使用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_

因此,我试图使用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!")
我一直在犯错误

回溯(最近一次呼叫最后一次): 文件“C:/Users/Backup/PycharmProjects/gro-app/harvest.py”,第123行,在 当前执行(“插入事实数据(域描述、商品描述、统计分类描述、聚集级别描述、国家名称、州名称、县名称、单位描述、值、年)值(域描述、商品描述、统计分类描述、聚集级别描述、国家名称、州名称、县名称、单位描述、值1、年值)” psycopg2.ProgrammingError:列“域描述”不存在 第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 + ")"

值之后
必须再次给出实际值,而不是列名。这些是变量名称,不是写在字符串中的。请阅读以了解如何传递变量。@KlausD。感谢这一点。我没有正确传递变量。这种方法易受SQL注入的影响,不要这样做!取决于这些变量的位置s来自。如果这个dict以前被检查过,那么它是可以的。一般来说,我同意,在设置变量到DB时存在一个很大的安全问题,之前没有检查它们,但这不是问题所在。很抱歉,这不起作用,KlausD。在我的问题中的注释有帮助