注册

pyinstaller打成二进制后运行报can`t load plugin: sqlalchemy.dialects:dm.dmPython

青山-linux 2023/06/19 1134 5 已解决

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM8
【操作系统】:Ubuntu
【CPU】:无
【问题描述】*:
使用dmPython,sqlalchemy_dm方言包对接达梦,url使用 "dm+dmPython://xxx"方式连接达梦,源码运行正常,在使用pyinstaller编译成二进制后连接时报can`t load plugin: sqlalchemy.dialects:dm.dmPython错误。

环境!
啊.png

使用官方提供的测试代码即可复现
https://eco.dameng.com/document/dm/zh-cn/app-dev/python-SQLAlchemy

创建test_dm,test_dm_bin两个文件夹,以下两个源码文件放入test_dm目录中

一、第一个文件 Product.py

# coding: utf-8
from sqlalchemy import Column, Integer, String,Date,Numeric,Text
from sqlalchemy.ext.declarative import declarative_base
# 创建对象的基类:
Base = declarative_base()

class Product(Base):
    # 表的名字:
    __tablename__ = 'product'
    # 表的结构:
    PRODUCTID = Column(Integer,autoincrement=True, primary_key=True)
    NAME = Column(String(100))
    AUTHOR = Column(String(25))
    PUBLISHER = Column(String(50))
    PUBLISHTIME = Column(Date)
    PRODUCTNO = Column(String(25))
    SATETYSTOCKLEVEL = Column(Integer)
    ORIGINALPRICE = Column(Numeric(19,4))
    NOWPRICE = Column(Numeric(19,4))
    DISCOUNT = Column(Numeric(2,1))
    DESCRIPTION = Column(Text)
    TYPE = Column(String(5))
    PAPERTOTAL = Column(Integer)
    WORDTOTAL = Column(Integer)
    SELLSTARTTIME = Column(Date)
    SELLENDTIME = Column(Date)

二、第二个文件 dm_sqlalchemy.py


# coding: utf-8
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from Product import Product
def main():
    #dialect 是SQLAlchemy用来与各种类型的DBAPI和数据库通信的系统。
    conn_url = 'dm+dmPython://SYSDBA: SYSDBA123@192.168.201.118:5236'
    #创建Engine对象
    engine = create_engine(conn_url)
    #创建DBSession对象
    DBSession = sessionmaker(bind=engine)

    fun_select_all(DBSession)
    # 插入
    fun_insert(DBSession)
    fun_select_all(DBSession)
    # 更新
    fun_update(DBSession)
    fun_select_all(DBSession)
    # 删除
    fun_delete(DBSession)
    fun_select_all(DBSession)

def fun_select_all(DBSession):
    # 创建Session
    session = DBSession()
    # 查询所有的
    list_product = session.query(Product).all()
    print('查询所有结果:')
    for product in list_product:
        print(product.NAME, product.AUTHOR, product.PUBLISHER )
    print('')
    session.close()

def fun_insert(DBSession):
    # 创建Session
    session = DBSession()
    new_product = Product()
    new_product.NAME = '水浒传'
    new_product.AUTHOR = '施耐庵,罗贯中'
    new_product.PUBLISHER = '中华书局'
    new_product.PUBLISHTIME = '2005-4-1'
    new_product.PRODUCTNO = '9787101046137'
    new_product.SATETYSTOCKLEVEL = '10'
    new_product.ORIGINALPRICE = '19'
    new_product.NOWPRICE = '14.3'
    new_product.DISCOUNT = '7.5'
    new_product.DESCRIPTION = '''  《水浒传》是宋江起义故事在民间长期流传基础上产生出来的,吸收了民间文学的营养。'''
    new_product.PHOTO = ''
    new_product.TYPE = '16'
    new_product.PAPERTOTAL = '922'
    new_product.WORDTOTAL = '912000'
    new_product.SELLSTARTTIME = '2006-03-20'
    new_product.SELLENDTIME = ''

    session.add(new_product)
    session.commit()
    print('插入成功')
    session.close()

def fun_update(DBSession):
    # 创建Session
    session = DBSession()
    product = session.query(Product).filter(Product.NAME == '水浒传').one()
    product.NAME = '水浒'
    session.commit()
    print('更新成功')
    session.close()

def fun_delete(DBSession):
    # 创建Session
    session = DBSession()
    session.query(Product).filter(Product.NAME == '水浒').delete()
    session.commit()
    print('删除成功')
    session.close()

if __name__ == '__main__':
    main()

在test_dm目录上一层使用pyinstaller编译
pyinstaller --hidden-import pty --hidden-import resource --hidden-import numbers --hidden-import decimal --hidden-import MySQLdb --hidden-import nss --hidden-import cookies --hidden-import google.auth --hidden-import kubernetes --hidden-import dmPython --hidden-import sqlalchemy_dm --hidden-import sqlalchemy -p ./ -n testdm --workpath=/tmp --specpath=/tmp --distpath=./test_dm_bin/ ./test_dm/dm_sqlalchemy.py

进入test_dm_bin/test_dm下执行程序 ./testdm 就会报错
can`t load plugin: sqlalchemy.dialects:dm.dmPython

解决办法:修改方言包逻辑,将dm加入即可,祥见最佳答案

回答 0
暂无回答
扫一扫
联系客服