场景:使用 sqlalchemy+pandas

1.  'OptionEngine' object has no attribute 'execute'

import pandas as pd
from sqlalchemy import create_engine, text engine = create_engine('mysql+pymysql://root:root1234@127.0.0.1:3308/beststock')
sql = "select max(id) as maxrid FROM tspro_stock_basic " df = pd.read_sql(sql, engine)
print(df)

Error: 提示报错信息:

Traceback (most recent call last):
File "C:\Users\Google_he\PycharmProjects\trunk\PyStock\UnitTest\Test_Sqlalchemy.py", line 15, in <module>
df = pd.read_sql(sql, engine)
File "D:\Program Files (x86)\Python39\lib\site-packages\pandas\io\sql.py", line 591, in read_sql
return pandas_sql.read_query(
File "D:\Program Files (x86)\Python39\lib\site-packages\pandas\io\sql.py", line 1561, in read_query
result = self.execute(*args)
File "D:\Program Files (x86)\Python39\lib\site-packages\pandas\io\sql.py", line 1406, in execute
return self.connectable.execution_options().execute(*args, **kwargs)
AttributeError: 'OptionEngine' object has no attribute 'execute'

排查:

查看 pd.read_sql 的 python 源码,原来,需要传递的是一个 connection,

def read_sql(
sql,
con,
index_col: str | list[str] | None = None,
coerce_float: bool = True,
params=None,
parse_dates=None,
columns: list[str] | None = None,
chunksize: int | None = None,
) -> DataFrame | Iterator[DataFrame]:

打印 传递的 engine 类型

print(type(engine))
// <class 'sqlalchemy.engine.base.Engine'>
// 原来对象传递错了,建立 connection,可以通过 engine.connect() 方法 print(type(engine.connect()))
<class 'sqlalchemy.engine.base.Connection'>

所以,需要改成

import pandas as pd
from sqlalchemy import create_engine, text engine = create_engine('mysql+pymysql://root:root1234@127.0.0.1:3308/beststock')
sql = "select max(id) as maxrid FROM tspro_stock_basic " # df = pd.read_sql(text(sql), con=engine.connect()) df = pd.read_sql(sql, engine.connect())
print(df)

2. 'str' object has no attribute '_execute_on_connection'

改成上面的代码后,出现了下面的错误

Traceback (most recent call last):
File "D:\Program Files (x86)\Python39\lib\site-packages\sqlalchemy\engine\base.py", line 1410, in execute
meth = statement._execute_on_connection
AttributeError: 'str' object has no attribute '_execute_on_connection' The above exception was the direct cause of the following exception: Traceback (most recent call last):
File "C:\Users\Google_he\PycharmProjects\trunk\PyStock\UnitTest\Test_Sqlalchemy.py", line 16, in <module>
df = pd.read_sql(sql, engine.connect())
File "D:\Program Files (x86)\Python39\lib\site-packages\pandas\io\sql.py", line 591, in read_sql
return pandas_sql.read_query(
File "D:\Program Files (x86)\Python39\lib\site-packages\pandas\io\sql.py", line 1561, in read_query
result = self.execute(*args)
File "D:\Program Files (x86)\Python39\lib\site-packages\pandas\io\sql.py", line 1406, in execute
return self.connectable.execution_options().execute(*args, **kwargs)
File "D:\Program Files (x86)\Python39\lib\site-packages\sqlalchemy\engine\base.py", line 1412, in execute
raise exc.ObjectNotExecutableError(statement) from err
sqlalchemy.exc.ObjectNotExecutableError: Not an executable object: 'select max(id) as maxrid FROM tspro_stock_basic '

继续查看 read_sql() 的源码,关于入参 sql 的注释及示例

sql : str or SQLAlchemy Selectable (select or text object)
SQL query to be executed or a table name.

再次改成下面,还是错误依旧

df = pd.read_sql("select max(id) as maxrid FROM tspro_stock_basic ", engine.connect())

确定是 入参 sql 的类型有问题,再次看到上面有提到的 text object,看来还是需要转换一下

import pandas as pd
from sqlalchemy import create_engine, text engine = create_engine('mysql+pymysql://root:root1234@127.0.0.1:3308/beststock')
sql = "select max(id) as maxrid FROM tspro_stock_basic " df = pd.read_sql(text(sql), con=engine.connect())
print(df) ---- output ----
maxrid
0 5066

最新文章

  1. LeetCode 1. Two Sum
  2. java归并排序,单线程vs多线程
  3. linux_shell_4_shell特性
  4. sqlserver查找表在哪个数据库脚本
  5. shell记录
  6. win32 api 文件操作!
  7. ZigBee 技术简介
  8. NSURLConnect 的简单实用(iOS8淘汰)
  9. Webserver管理系列:5、利用MSConfig排查木马
  10. DNS 域名系统 (Domain Name System)
  11. C指针 指针和数组 二维数组的指针 指针应用
  12. maven 不能使用 snapshot 的解决方式
  13. 方差variance, 协方差covariance, 协方差矩阵covariance matrix
  14. SVM(支持向量机)简介与基础理解
  15. Android开发——RecyclerView特性以及基本使用方法(二)
  16. Spring学习--静态工厂方法、实例工厂方法创建 Bean
  17. python第二十三课——dict中的函数
  18. linux系统mysql主主复制(双主复制)
  19. jQuery获取table表中的td标签
  20. Explain分析查询语句

热门文章

  1. GPIO 和中断控制 LED 的状态
  2. Spring cloud Alibaba Nacos服务注册发现和配置中心
  3. Bouncy Castle密码算法库
  4. 两行CSS让页面提升了近7倍渲染性能
  5. python 获取docker容器内存使用率
  6. vite+vue3.0+ts搭建项目
  7. rocketmq集群配置
  8. etcdctl 安装与使用
  9. Wordpress后台网址安全
  10. js实现禁止浏览器后退