ObjectNotExecutableError执行任何SQL查询使用AsyncEngine



我使用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之前的版本:
  1. 首先,确认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
  1. 恢复到旧版本(使用下面的命令安装特定版本的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))

相关内容

  • 没有找到相关文章

最新更新