【发布时间】:2021-02-14 09:59:53
【问题描述】:
我有一个在 SQL 编辑器中运行良好的查询:
UPDATE users mu
JOIN (SELECT
min.user_id as user_id,
(max.total_followers - min.total_followers) as progression
FROM(select user_id, measurement_date, total_followers
from followers_totals ft
where measurement_date = (select max(measurement_date) from followers_totals as f where f.user_id = ft.user_id
and date_format(ft.measurement_date, '%%Y-%%m-%%d') >= date_format(date_sub(CURDATE(), interval 7 day), '%%Y-%%m-%%d'))) max
JOIN (select user_id, measurement_date, total_followers
from followers_totals ft
where measurement_date = (select min(measurement_date) from followers_totals as f where f.user_id = ft.user_id
and date_format(ft.measurement_date, '%%Y-%%m-%%d') >= date_format(date_sub(CURDATE(), interval 7 day), '%%Y-%%m-%%d'))) min
ON max.user_id = min.user_id
WHERE min.user_id = '123456' and max.user_id = '123456') progression
ON progression.user_id = mu.user_id
SET mu.followers_count_progress_7D = progression.progression
WHERE progression.user_id is not null;
我尝试使用执行函数从 SQLAlchemy 执行相同的查询:
import sqlalchemy
from sqlalchemy import create_engine, Table, MetaData, exc
eng = create_engine('mysql://xxxxxxxxxxxxxxxxxxxxxxxxxxxx')
con = eng.connect()
try:
query = """UPDATE users mu
JOIN (SELECT
min.user_id as user_id,
(max.total_followers - min.total_followers) as progression
FROM(select user_id, measurement_date, total_followers
from followers_totals ft
where measurement_date = (select max(measurement_date) from followers_totals as f where f.user_id = ft.user_id
and date_format(ft.measurement_date, '%%Y-%%m-%%d') >= date_format(date_sub(CURDATE(), interval 7 day), '%%Y-%%m-%%d'))) max
JOIN (select user_id, measurement_date, total_followers
from followers_totals ft
where measurement_date = (select min(measurement_date) from followers_totals as f where f.user_id = ft.user_id
and date_format(ft.measurement_date, '%%Y-%%m-%%d') >= date_format(date_sub(CURDATE(), interval 7 day), '%%Y-%%m-%%d'))) min
ON max.user_id = min.user_id
WHERE min.user_id = '123456' and max.user_id = '123456') progression
ON progression.user_id = mu.user_id
SET mu.followers_count_progress_7D = progression.progression
WHERE progression.user_id is not null;"""
rs = con.execute(query)
print(rs)
except exc.SQLAlchemyError as e:
print (e)
不返回异常,并且 print(rs) 会按预期返回代理。 但是,在使用 SQL 编辑器更新数据库时,不会使用 SQLAlchemy 更新数据库。 SQL Alchemy 是否不支持我的查询的某些部分?
我最初认为这将是日期格式中 % 的转义,但不同的测试表明,使用这种转义写作更简单的查询可以按预期运行。
编辑:按照上面的建议在引擎创建中使用 echo=True 后,我可以看到查询格式被保留,提交完成。我将 echo 的输出复制粘贴到 sql 编辑器,查询运行良好,但使用 sqlalchemy 它根本不会更新。
EDIT2:尝试添加 autocommit=True 并得到相同的结果.... 日志显示:
2021-02-14 11:21:21,387 INFO sqlalchemy.engine.base.Engine ()
2021-02-14 11:21:21,389 INFO sqlalchemy.engine.base.Engine UPDATE users mu
JOIN (
SELECT min.user_id as user_id,
(max.total_followers - min.total_followers) as progression
FROM(
select user_id, measurement_date, total_followers
....
ON progression.user_id = mu.user_id
SET mu.followers_count_progress_7D = progression.progression
WHERE progression.user_id is not null;
2021-02-14 11:21:21,389 INFO sqlalchemy.engine.base.Engine ()
2021-02-14 11:21:21,393 INFO sqlalchemy.engine.base.Engine COMMIT
0
用于连接的用户拥有所有权限:
GRANT ALL ON *.* TO 'user1'@'%';
在 SQLAlchemy 上运行的更简单的更新查询实际上正在运行。
编辑 3: 有趣的是,这似乎只发生在某些 id 上,但不是全部。依赖 ID 的东西如何远程工作而不是本地工作......?
【问题讨论】:
-
我对 SQLAlchemy 一无所知,但我会要求 MySQL 记录查询,以便您可以将其与您发送的查询进行比较(差异)。见dev.mysql.com/doc/refman/8.0/en/log-destinations.html
-
无法将其添加为注释,因为 0 rep,但您可以将
echo=True添加到create_engine以调试查询。此外,不确定这是否会产生影响,但您可以尝试关闭连接,如果默认情况下不这样做,则应该强制提交并刷新更改(也许它不适用于更大的查询?)。 -
谢谢,这有帮助。回声向我显示了完全相同的查询,所以这里没有格式问题....但更新不起作用。我在sql编辑器中复制粘贴了echo的输出,它可以工作....不知道那里发生了什么:2021-02-14 10:24:57,959 INFO sqlalchemy.engine.base.Engine () 2021-02-14 10:24:57,979 信息 sqlalchemy.engine.base.Engine COMMIT 0
-
如何验证更新是否有效?
-
我打印 rs.rowcount,但我也有一些 ID 被我识别为在 IDE 上而不是在脚本中更新...并在运行查询或脚本后检查这些
标签: python sqlalchemy