Python SQLAlchemy执行查询,但不更新,尽管原始查询在SQLIDE中运行良好

Python SQLAlchemy执行查询,但不更新,尽管原始查询在SQLIDE中运行良好,python,sqlalchemy,Python,Sqlalchemy,我有一个在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 w

我有一个在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;
我尝试使用execute函数从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)
不会返回任何异常,并且打印(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上。依赖于ID的东西如何能够远程工作而不是本地工作…?

由于调试打印似乎没有提供足够的信息来解决这个问题,我将假设这确实是一个向DB提交更改的问题,因此,就像其他人在各种其他问题(例如:)中提到的那样,您应该尝试显式地使用
autocommit=True

您可以使用
with
语句来测试这一点,例如:

使用engine.connect()。执行选项(autocommit=True)作为连接:
conn.execute(查询)
或者只是在现有代码中附加
.execution\u选项(autocommit=True)

conn.execute(查询).execution\u选项(autocommit=True)
请注意,
execution\u选项
autocommit
参数将被SQLAlchemy 1.4弃用,替换将设置事务隔离级别,如图所示


重申一下,MySQL似乎在内部将autocommit值设置为0,这意味着它使用了一个需要
.commit()
ed的事务将其传播到数据库。希望这确实解决了问题,因为我目前还没有准备在我的机器上测试这个问题。

我对SQLAlchemy一无所知,但我会让MySQL记录查询,以便您可以将它与您发送的查询进行比较。请参阅无法将此添加为注释,因为0代表,但您可以将
echo=True
添加到
create\u engine
以调试查询。另外,不确定这是否会产生影响,但您可以尝试关闭连接,如果默认情况下没有这样做,那么应该强制提交并刷新更改(对于更大的查询可能没有)。谢谢,这很有帮助。echo向我显示了完全相同的查询,因此这里没有格式问题。。。。但更新不起作用。我在sql编辑器中复制并粘贴了echo的输出,它可以工作。。。。不知道那里发生了什么:2021-02-14 10:24:57959 INFO-sqlalchemy.engine.base.engine()2021-02-14 10:24:57979 INFO-sqlalchemy.engine.base.engine提交0如何验证更新是否有效?我打印rs.rowcount,但我还有一些标识,标识为在IDE上更新,而不是在脚本中更新。。。并在运行查询或ScriptThanks之后检查这些。不幸的是,这并不能解决问题。在日志中,我甚至可以在提交消息之前看到,更简单的更新查询也在工作(将使用这些信息编辑q)。我检查了我拥有的用户是否拥有所有权限,它确实、、、和。我确信这就是问题所在。我记得以前有过权限和登录问题,但SQLAlchemy明确地以更详细的方式抱怨了这些问题。只是一个快速更新,但当我使用会话API而不是连接时,我似乎能够运行它。。。。这有多疯狂…是的,它真的只是闻起来有一些奇怪的配置问题,而不使用会话API在这一点上。。。