分类 "SQLAlchemy" 下的文章

问题:因为是项目从mysql更换到达梦dm8数据库,同时数据库字段也需要更换为国标要求,使用column_property会有警告,改用synonym,但在Mixin类中会报错:sqlalchemy.exc.InvalidRequestError: Mapper properties (i.e. deferred,column_property(), relationship(), etc.) must be declared as @declared_attr callables on declarative mixin classes. For dataclass field() objects, use a lambda

解决:根据提示使用@declared_attr进行装饰

方法:

from sqlalchemy.ext.declarative import declarative_base, declared_attr
from sqlalchemy.orm import synonym
from db.session import engine
from sqlalchemy import (
    Column, Integer, String, DateTime)

Base = declarative_base()
Base.metadata.create_all(bind=engine)

阅读全文

问题:数据量大,分页查询时卡顿,如何解决?

解决:通过join方式,先查询主键,再查询内容

方法:

offset_num = (page - 1) * pagesize
sub_q = select(
    User.id).filter_by(**obj_get).order_by(
    User.id.asc()).offset(
    offset_num).limit(pagesize).subquery()
q = select(
    User.uid, User.username, User.fullname, User.national_id, User.phone, User.email,
    User.gender, User.last_login, User.status, User.create_time,
    User.expire_time).join(sub_q, User.id == sub_q.c.id)
r = await db.execute(q)
return r.all()

阅读全文

问题:数据量大,接口请求太慢,如何判断是哪个语句拖慢了时间?

解决:可以使用logger进行debug,输出每个语句的运行时间

方法:

将下面代码与你的create_engine放一起就可以了

from sqlalchemy import event
from sqlalchemy.engine import Engine
import time
import logging

logging.basicConfig()
logger = logging.getLogger("myapp.sqltime")
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler("test_log.log", encoding="utf-8")
logger.addHandler(fh)

阅读全文

问题:python(superset)如何连接达梦数据库?sqlalchemy如何连接dm8?

解决:需要两个驱动dmPython,sqlalchemy_dm

方法:

1、复制dmPython,sqlalchemy等文件夹(本人superset和达梦数据库不在同一服务器,所以需要复制)

cd /opt/dm8   // 本人达梦数据库安装服务器
mkdir fakedm8
cp -r ./bin ./fakedm8
cp -r ./include ./fakedm8
cp -r ./drivers/python/dmPython/ ./fakedm8
// 注意:使用2.0.0报错AttributeError: type object 'DMDialect_dmPython' has no attribute 'dbapi'
// 使用1.1.10时报错AttributeError: 'DMExecutionContext_dmPython' object has no attribute 'compiled_parameters'
cp -r ./drivers/python/sqlalchemy1.4.6/ ./fakedm8
scp -r fakedm8/ hadoop01:~/   // 将复制的文件夹传送到superset服务器

2、配置fakedm8路径

mv ~/fakedm8/ /opt/module/
vim ~/.bash_profile  // 加入下面三行内容
    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/module/fakedm8/bin"
    export DM_HOME="/opt/module/fakedm8"
    export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool
source ~/.bash_profile

阅读全文

问题:sqlalchemy的outerjoin外表时需要添加条件,使用filter过滤会到where中,而不是在on语句中

解决:使用and_

方法:

offset_num = (page - 1) * pagesize
q = select(
    User.uid, User.username, User.fullname, User.national_id, User.phone,
    User.gender, User.last_login, User.status, User.create_time,
    func.group_concat(UserRole.role_id).label('role_ids')).outerjoin(
    UserRole, and_(User.uid == UserRole.user_uid,
    UserRole.is_delete == obj_get['is_delete'])).filter(
    User.is_delete == obj_get['is_delete']).group_by(
    User.uid).offset(offset_num).limit(pagesize)
r = await db.execute(q)
return r.all()

阅读全文