【发布时间】:2020-11-27 20:37:08
【问题描述】:
以下是 python 中的代码,用于更新所需数据库表中的记录。有没有更好的处理方式?
在 SO 中读取,逐行扫描数据帧是一个耗时的过程。有什么更好的处理方法?
for index, row in outputData.iterrows():
try:
updatesql = " update table set [fieldname] = {0:f} where dt = \'{1:s}\'" .format(fieldvalue , currentdt)
updatecursor.execute(updatesql)
sql_conn.commit();
except IOError as e:
print ("({})".format(e))
pass
except (RuntimeError, TypeError, NameError) as e:
print ("({})".format(e))
pass
根据下面的讨论,做出了改变,但面临两个问题。
updatesql = " update table set [fieldname] = ? where dt = ?"
data = (outputData.reindex( ['fieldvalue'], currentDt,axis='columns').to_numpy())
# EXECUTE QUERY AND BIND LIST OF TUPLES
updatecursor.executemany(updatesql, data.tolist())
sql_conn.commit()
问题 a) 日期是常量,不是 OutputData 数据帧的一部分。 b) 浮点值以科学格式存储。更喜欢以精度存储浮点值。
【问题讨论】:
-
首先,停止使用模运算符
%进行字符串格式化。这个method has been de-emphasized in Python but not officially deprecated yet。相反,请使用首选的str.format(Python 2.6+) 或更新的 F-string (Python 3.6+)。 (实际上你应该为这个问题使用 SQL 参数化)。 -
@Parfait,更新了我的代码。谢谢
-
使用字符串格式将数据值插入到 SQL 语句中仍然是一种不鼓励的做法。此外,使用
.execute()逐行遍历DataFrame 的效率低于.executemany()(或my answer 中的等效SQLAlchemy)。 -
@GordThompson,请查看最新声明。我不再循环遍历它。但仍在寻找一种格式化浮点值的方法。
标签: python python-3.x pyodbc