You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将SQLAlchemy查询与ADBC驱动结合?能否用create_engine?

解决SQLAlchemy查询与ADBC驱动结合的问题

1. 将SQLAlchemy Select对象转为ADBC可执行的查询

直接用str(query)无法生效的核心原因是:该方式仅生成SQL文本,但未正确处理参数绑定,且可能不匹配ADBC驱动要求的占位符格式(比如PostgreSQL的$1、$2风格)。正确的做法是通过SQLAlchemy的compile方法生成适配ADBC的SQL字符串和参数:

from adbc_driver_postgresql import dbapi
from sqlalchemy import create_engine
from sqlalchemy.sql import select
import pandas as pd

# 假设你已经构建好select查询
query = select(*cols).where(...)

# 编译查询,生成适配ADBC的SQL和参数
compiled_query = query.compile(
    compile_kwargs={"literal_binds": False},  # 保留占位符,避免SQL注入风险
    dialect=create_engine("postgresql+adbc:///").dialect  # 指定ADBC对应的PostgreSQL方言
)
sql_text = str(compiled_query)
query_params = compiled_query.params

# 使用ADBC连接执行查询
with dbapi.connect('postgres:///db_name') as conn:
    data = pd.read_sql(sql_text, con=conn, params=query_params)

2. 通过SQLAlchemy create_engine直接使用ADBC驱动

SQLAlchemy 2.0.16及以上版本已原生支持ADBC驱动,你可以直接通过指定postgresql+adbc://格式的URL创建引擎,无需手动调用ADBC的dbapi:

from sqlalchemy import create_engine
from sqlalchemy.sql import select
import pandas as pd

# 创建ADBC引擎
engine = create_engine("postgresql+adbc://user:password@localhost:5432/db_name")

# 直接使用SQLAlchemy的Select对象查询
query = select(*cols).where(...)

with engine.connect() as conn:
    # 方式1:用SQLAlchemy执行并转换为DataFrame
    result = conn.execute(query)
    data = pd.DataFrame(result.fetchall(), columns=result.keys())
    
    # 方式2:直接传给pandas read_sql
    data = pd.read_sql(query, con=conn)

注意事项

  • 确保安装对应版本依赖:sqlalchemy>=2.0.16、adbc-driver-postgresql
  • 使用create_engine时,URL格式需严格遵循postgresql+adbc://[user:password@][host:port]/dbname结构

内容的提问来源于stack exchange,提问作者MMCM_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:15:03