强制转换字段类型
- 对于数字类型的字段,最好不要加引号,以避免可能的类型转换问题。
- 但在实际操作中,如果不小心加了引号,通常也不会有太大的问题。
- 在Python中,可以使用pymysql的参数化查询功能来避免在SQL语句中加引号。
# 注意: 数据库中 id 这个字段类型为int
async with pool.acquire() as conn:
async with conn.cursor() as cursor:
sql = "SELECT COUNT(*) AS c FROM `table` WHERE `date`=%s AND `id`=%s"
# 错误的写法
data1 = ('2023-12-16', 1)
await cursor.execute(sql, data1)
# 正确的写法
data2 = ('2023-12-16', int(1))
await cursor.execute(sql, data2)
- 如果
1
没有加上int
, 则实际查询语句为:
SELECT COUNT(*) AS c FROM `table` WHERE `date`='2023-12-16' AND `id`='1'
- 如果
1
没有加int
, 则实际查询语句为:
SELECT COUNT(*) AS c FROM `table` WHERE `date`='2023-12-16' AND `id`=1
如何查询真实的查询语句
- 在Python中,通常情况下,我们无法直接从数据库连接或游标对象中获取最后一次执行的SQL语句。
- 这是因为SQL语句在执行后并不会被存储在这些对象中。
- 但是可以通过MySQL的日志功能来查看执行过的SQL语句。
- 需要先启用MySQL的日志记录功能,然后可以查询mysql.general_log表来查看执行过的SQL语句。
# 开启查询记录
SET GLOBAL log_output = 'TABLE';
SET GLOBAL general_log = 'ON';
# 查看历史查询记录
SELECT * FROM mysql.general_log;
# 最后,不用的时候,还原初始设置
SET GLOBAL log_output = 'FILE';
SET GLOBAL general_log = 'OFF';
# 清空这个记录表
TRUNCATE mysql.general_log;