我使用async_engine。当我尝试执行任何操作时:
async with self.async_engine.connect() as con:
query = "SELECT id, name FROM item LIMIT 50;"
result = await con.execute(f"{query}")
我:
Exception has occurred: ObjectNotExecutableError
Not an executable object: 'SELECT id, name FROM item LIMIT 50;'
这个问题之前是由用户@stilmaniac问的,但是现在从SO中删除了。
我在谷歌搜索缓存中找到了它,这里是副本。
我有同样的问题,所以我问它,但原始版本如下:
我正在尝试从元数据创建表,如下所示:
Base = declarative_base()
properties = Table(
'properties', Base.metadata,
# ...
Column('geolocation', Geography(geometry_type='POINT', srid=4326)),
# ...
)
engine = create_async_engine("postgresql+asyncpg://user:password@postgres/")
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
给出以下错误:
sqlalchemy.exc.ObjectNotExecutableError: Not an executable object: 'CREATE INDEX "idx_properties_geolocation" ON "properties" USING GIST ("geolocation")'
考虑到这个文档
版本:
- OS: macOS 11.4 ARM
- SQLAlchemy: 1.4.22
- Python: 3.6
如异常消息所示,str
'SELECT id, name FROM item LIMIT 50;'
不是可执行对象。要使其可执行,使用sqlalchemy.text包装它。
from sqlalchemy import text
async with self.async_engine.connect() as con:
query = "SELECT id, name FROM item LIMIT 50;"
result = await con.execute(text(query))
async.connection。Execute要求它的语句参数
[…总是一个同时存在于ClauseElement和可执行层次,包括:
选择
插入、更新、删除
TextClause and TextualSelect
DDL和从DDLElement继承的对象
同步连接。execute方法允许使用原始字符串,但这在v1.4中已弃用,并已在SQLAlchemy 2.0中删除。
恢复到旧版本(使用下面的命令安装特定版本的SQLAlchemy):
pip install SQLAlchemy==1.4.17
确认一次版本:
pip show sqlalchemy
重新运行脚本。
这个问题与这个线程有关
解决方法:为了避免这个错误,我将SQLAlchemy的版本恢复到2.0之前的版本:- 首先,确认SQLAlchmey版本是否为2.0或更高版本。为此,运行
pip show sqlalchemy
显示如下:
Verify current version from output:
Name: SQLAlchemy
Version: 2.0.9
Summary: Database Abstraction Library
Home-page: https://www.sqlalchemy.org
Author: Mike Bayer
Author-email: mike_mp@zzzcomputing.com
License: MIT
Location: /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages
Requires: typing-extensions
Required-by: pandasql
- 恢复到旧版本(使用下面的命令安装特定版本的SQLAlchemy):
pip install SQLAlchemy==1.4.17
确认一次版本:
pip show sqlalchemy
重新运行脚本
这是由于sqlalchemy将查询视为字符串,下面的工作区是working
from sqlalchemy import text
query = 'insert into table_name values(1,2,3)'
with pool.connect() as db_conn:
db_conn.execute(text(q))