为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM8
【操作系统】:Ubuntu
【CPU】:无
【问题描述】*:
使用dmPython,sqlalchemy_dm方言包对接达梦,url使用 "dm+dmPython://xxx"方式连接达梦,源码运行正常,在使用pyinstaller编译成二进制后连接时报can`t load plugin: sqlalchemy.dialects:dm.dmPython错误。
环境!
使用官方提供的测试代码即可复现
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加入即可,祥见最佳答案
有py的源码吗,发个demo出来