在以上开发环境下,使用sqlalchemy进行操作达梦数据库,一直报错 DMExecutionContext_dmPython object has not attribute _is_server_side,无论是执行原生sql还是使用orm模型映射,都无法正常使用
本地安装有达梦可视化客户端,连接正常
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.engine import create_engine
# dm engine
dm_engine = create_engine("dm+dmPython://%s:%s@%s:%s/?schema=%s", pool_pre_ping=True, echo=False, connect_args={'local_code': 1, 'connection_timeout': 15})
session_dm = sessionmaker(bind=dm_engine)
DMBase = declarative_base(bind=dm_engine)
class get_session:
def __init__(self, eng: sessionmaker):
self.eng = eng
def __call__(self):
self.eng.configure(autocommit=False, autoflush=False)
session = self.eng()
try:
yield session
finally:
session.close()
get_dm_session = get_session(session_dm)
create table "dm_test" (
"test_1" varchar2(144) not null,
"test_2" varchar2(2000),
"test_3" varchar2(2000),
"test_4" varchar2(2000),
"test_5" varchar2(2000),
"test_6" varchar2(2000),
"test_7" varchar2(2000),
"test_8" varchar2(1020) not null,
constraint "pk_test_1" primary key("test_1")
);
from sqlalchemy.sql.schema import Column, PrimaryKeyConstraint, UniqueConstraint
from sqlalchemy_dm.types import VARCHAR2
from sqlalchemy.ext.declarative import declarative_base
from . import dm_engine, DMBase
class test_tab(DMBase):
__tablename__ = "dm_test"
__table_args__ = (
PrimaryKeyConstraint("test_1", name="pk_test_1"),
UniqueConstraint("test_1")
)
test_1 = Column(VARCHAR2(144), nullable=False)
test_2 = Column(VARCHAR2(2000))
test_3 = Column(VARCHAR2(2000))
test_4 = Column(VARCHAR2(2000))
test_5 = Column(VARCHAR2(2000))
test_6 = Column(VARCHAR2(2000))
test_7 = Column(VARCHAR2(2000))
test_8 = Column(VARCHAR2(2000), nullable=False)
DMBase.metadata.create_all()
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from . import test_tab
router = APIRouter(prefix='/test')
@router.get('/dm_test')
async def dm_test(session: Session = Depends(get_dm_session)):
# result = session.execute("select * from all_tables")
result = session.query(test_tab).all()
print(result)
return None
问题已解决,sqlalchemy-dm降级到1.1.10。
在安装镜像中提供的驱动之间依赖性很强,不同版本间并不能相互兼容
我在drivers目录下分别安装了dmPython、sqlalchemy-dm导致不能相互兼容,后面全卸载了,直接安装dirvers下的sqlalchemy(里面包含dmPython、sqlalchemy-dm;两个的版本是能兼容的)就能使用了
错误堆栈输出