Lambda 上 PyMSQL + SQLAlchemy 中的幻象查询

Posted

技术标签:

【中文标题】Lambda 上 PyMSQL + SQLAlchemy 中的幻象查询【英文标题】:Phantom Queries in PyMSQL + SQLAlchemy on Lambda 【发布时间】:2021-08-30 15:27:40 【问题描述】:

我正在尝试调试我们的一位开发人员最近发现的问题。 我们使用 AWS Lambda 函数定期查询我们的 mysql 数据库。 这些函数是用 Python 3.7 编写的,并添加了一个 Lambda 层以支持使用 PyMSQL、SQLAlchemy 和 Pandas。 (摘要和编辑)代码如下所示:

import pymysql
from sqlalchemy import create_engine
import pandas as pd

mysql_connector = create_engine('mysql+pymysql://' + oltp_username + ':' + oltp_password + '@' + host + '/' + db_name)
query = """
        SELECT sum(field) + """
        FROM schema.table;
        """
df = pd.read_sql(query, mysql_connector)

效果很好,并返回了预期的结果,但是有一个奇怪的副作用。我们的查询记录软件表明从这个函数接收到两个查询:格式正确的预期查询,以及一个看起来像这样的神秘查询:

DESCRIBE `
        SELECT sum(field)
        FROM schema.table;
        `

在 MySQL 中,这显然是一个格式错误的查询,因为 DESCRIBE 对表进行操作。我们的查询日志记录软件表明,从此 Lambda 函数运行的每个查询都会出现此错误。

有人知道这些幻像查询可能来自哪里吗?我认为它是 PyMYSQL 或 SQLAlchemy 中的某个选项,但我在文档中找不到任何内容。另外,为什么要发送这些?包含 DESCRIBE 是没有意义的。我怀疑它只是将原始查询字符串发送到 DESCRIBE 函数,因为像 DATE_FORMAT(datefield,"%%Y-%%m-%%d %%H:%%i:00") 这样的表达式以连续的 % 出现,而​​不是像在正确的查询中那样被正确转义。

【问题讨论】:

我可以使用 SQLAlchemy 1.3 重现这一点,前提是查询由 Pandas 执行。猜测一下,Pandas 想知道结果集的“表结构”,这会触发 SQLA 中的错误代码。额外的查询不会在 1.4 中发生,或者如果 Pandas 没有在 1.3 中发生。 read_sql 尝试同时支持表和查询。当你传递一个字符串时,它不知道它是一个表名还是一个查询,所以它可能首先假设一个表(我在这里猜)。您可以改为显式使用pandas.read_sql_query 调用从 Pandas 中的 here 到 here 到 SQLAlchemy 中的 here。 @snakecharmerb 谢谢!升级工作得很好。这是一个有趣的错误,我很高兴它在新版本中得到了修复。 【参考方案1】:

snakecharmerb 和 Ilja Everilä 在 cmets 中提供了一些答案,所有这些都有效。谢谢!

    将 SQLAlchemy 升级到 1.4 版 不要使用 pandas 来执行 SQL。 使用 pandas read_sql_query 函数代替 read_sql。

【讨论】:

以上是关于Lambda 上 PyMSQL + SQLAlchemy 中的幻象查询的主要内容,如果未能解决你的问题,请参考以下文章

pymsql与ORM--python操作MySQL之利器

Python----Mysql操作

python-- pymsql外键

pymsql实现增删改查(python)

python下操作mysql 之 pymsql

pymsql随笔