【问题标题】:The problem with the formation of SQL queries. Python, pymysqlSQL查询的形成问题。蟒蛇,pymysql
【发布时间】:2021-12-18 22:59:55
【问题描述】:

我想将 bot 数据库从 SQLite 更改为 MySQL (pymysql),但遇到了问题。

我有一个生成 sql 查询的函数,但由于某种原因它停止了工作:

def update_format_with_args(sql, parameters: dict):
values = ", ".join([
    f"{item} = ?" for item in parameters
])
sql = sql.replace("XXX", values)
return sql, tuple(parameters.values())

def update_settingsx(**kwargs):
with connection.cursor() as db:
    sql = f"UPDATE main_settings SET XXX "
    sql, parameters = update_format_with_args(sql, kwargs)
    db.execute(sql, parameters)
    db.commit()

错误:

 update_settingsx(profit_buy=now_unix)
   File "/root/rent/bot_id/utils/db_api/sqlite.py", line 154, in update_settingsx
     db.execute(sql, parameters)
   File "/usr/local/lib/python3.7/dist-packages/pymysql/cursors.py", line 168, in execute
     query = self.mogrify(query, args)
   File "/usr/local/lib/python3.7/dist-packages/pymysql/cursors.py", line 147, in mogrify
     query = query % self._escape_args(args, conn)
 TypeError: not all arguments converted during string formatting

【问题讨论】:

    标签: python mysql pymysql


    【解决方案1】:

    并非每个数据库连接器都支持? 替换方案。 Pymysql 改用%s

    另一种选择是使用命名替换:

    def update_format_with_args(sql, parameters: dict):
        values = ", ".join([
            f"{item} = %({item})s" for item in parameters
        ])
        sql = sql.replace("XXX", values)
        return sql, parameters
    

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-29
      • 2021-10-11
      相关资源
      最近更新 更多