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 中的幻象查询的主要内容,如果未能解决你的问题,请参考以下文章