【发布时间】:2021-12-23 07:17:21
【问题描述】:
我开发了一个 Python 程序,它可以读取 Excel 文件,对其执行操作,并使用 psycopg2 包和 SQL 语句将信息上传到数据库中。 这些 SQL 语句存储在一个列表中,并使用 for 循环执行:
def my_method_results_quant_rsk(input_data_frame, database_data_frame):
combination_set = set()
sql_querys_results_quant_rsk = []
for index, row in database_data_frame.iterrows():
temp_string = str(row["reference_date"]) + str(row["risk_category"]) + \
str(row["risk_subcategory"]) + str(row["source"])
temp_string = ''.join(temp_string.split())
combination_set.add(temp_string)
for index, row in input_data_frame.iterrows():
temp_string = str(row["date"]) + str(row["category"]) + str(row["subcategory"]) + str(row["source"])
temp_string = ''.join(temp_string.split())
reference_date = row['date']
risk_category = row['category']
risk_subcategory = row['subcategory']
source = row['source']
cap_limit = row['limit']
cap_requirement = row['riskCap']
percentage = row['percentage']
if temp_string in combination_set:
sql_query_results_quant_rsk_1 = f"UPDATE results_quant_rsk SET cap_limit = '{cap_limit}' WHERE reference_date = '{reference_date}' AND risk_category = '{risk_category}' AND risk_subcategory = '{risk_subcategory}' AND source = '{source}';"
sql_query_results_quant_rsk_2 = f"UPDATE results_quant_rsk SET cap_requirement = '{cap_requirement}' WHERE reference_date = '{reference_date}' AND risk_category = '{risk_category}' AND risk_subcategory = '{risk_subcategory}' AND source = '{source}';"
sql_query_results_quant_rsk_3 = f"UPDATE results_quant_rsk SET percentage = '{percentage}' WHERE reference_date = '{reference_date}' AND risk_category = '{risk_category}' AND risk_subcategory = '{risk_subcategory}' AND source = '{source}';"
sql_querys_results_quant_rsk.append(sql_query_results_quant_rsk_1)
sql_querys_results_quant_rsk.append(sql_query_results_quant_rsk_2)
sql_querys_results_quant_rsk.append(sql_query_results_quant_rsk_3)
else:
sql_query_results_quant_rsk = f"INSERT INTO results_quant_rsk(reference_date, risk_category, risk_subcategory, source, cap_limit, cap_requirement, percentage) VALUES('{reference_date}', '{risk_category}', '{risk_subcategory}', '{source}', '{cap_limit}', '{cap_requirement}', '{percentage}');"
sql_querys_results_quant_rsk.append(sql_query_results_quant_rsk)
return sql_querys_results_quant_rsk
然后执行上面方法中创建的列表:
for sql in sqls_results_quant_rsk:
my_cursor.execute(sql)
执行效果非常好。但是,之后我需要按日期订购数据表,但由于某种原因无法正常工作。该表称为“results_quant_rsk”,带有日期的列称为“reference_date”,类型为date NOT NULL。我试过了:
my_cursor.execute("SELECT * FROM results_quant_rsk ORDER BY reference_date;")
您可以在下面看到“reference_date”列中显然没有排序的行...
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-09-30"
"2021-10-31"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"
相反,它应该按升序排列。
【问题讨论】:
-
您正在循环中执行多个查询。这些是一个查询的结果还是全部?因为每个人都会从头开始。
-
我正在执行多个查询,这些查询要么将条目添加到数据库,要么更新现有条目。 “每个人都会从头开始”是什么意思?
-
我猜你显示的输出是多个 SELECT 查询的结果。每个都正确排序,但当您查看组合结果时,它们不是。
-
为确保不会发生这种情况,order 语句不在 for 循环中执行,而是在之后执行。我还尝试关闭游标并提交所有更新更改,然后再次打开游标,执行命令语句并再次提交......没有成功......
-
如果您无法提供minimal reproducible example,我们将无法解决此问题。
标签: python sql database psycopg2