注册
dmPython学习笔记
专栏/技术分享/ 文章详情 /

dmPython学习笔记

wwwwww 2026/09/18 340 0 0
摘要

1. 概述

dmPython 是达梦依循 Python DB API 2.0 开发的接口,通过调用 DPI 完成扩展。除 Python 标准库外还需 DPI 运行环境。

模块常量:

常量 值 含义
apilevel ‘2.0’ 支持的 DB API 版本
threadsafety 1 线程可共享模块,但不能共享连接
paramstyle ‘qmark’ 只支持 ? 位置绑定

2. 安装

离线安装:先装达梦数据库或下载驱动压缩包,再配置环境变量——Linux 把 DPI 动态库目录加入 LD_LIBRARY_PATH 并设 DM_HOME;Windows 设 DM_HOME 和 PATH。安装方式分源码(python setup.py install)、whl(pip install dmPython-2.4.5.whl)、rpm(rpm -ivh dmPython-2.1-7.1-py33-1.x86_64.rpm --nodeps)。

在线安装:pip install dmPython,支持的 Python 版本 2.7、3.4~3.12,平台 win_amd64、x86_64。Python ≥3.12 需同时装 setuptools。

3. 连接数据库

3.1 三种连接写法

import dmPython # 1. 关键字参数 conn = dmPython.connect(user='SYSDBA', password='Dmsys_123', server='localhost', port=5236, autoCommit=True) # 2. 属性字典 conn = dmPython.connect(**{'user': 'SYSDBA', 'password': 'Dmsys_123', 'server': '127.0.0.1', 'port': 5236}) # 3. 省略关键字的写法,顺序不能打乱 conn = dmPython.connect('SYSDBA', 'Dmsys_123', 'localhost:5236') # 4. 连接串写法 conn = dmPython.connect('SYSDBA/Dmsys_123@localhost:5236/sch1')

省略关键字的写法顺序不能打乱,指定了关键字则不要求顺序。连接串内只允许 “user/password@ip:port/schema” 五个关键字,省略只能从后往前依次省略。

3.2 连接属性

关键字 说明 默认值
user 登录用户名 SYSDBA
password 登录密码(必填) —
dsn “主机:端口” 字符串 —
host / server 主机地址,二者只允许指定一个 localhost
port 端口号 5236
access_mode 访问模式 读写
autoCommit DML 是否自动提交 TRUE
connection_timeout 执行超时(秒) 0 不限制
login_timeout 登录超时(毫秒) 5000
txn_isolation 事务隔离级 服务器隔离级
app_name 应用程序名 —
compress_msg 消息是否压缩 —
use_stmt_pool 语句句柄缓存池 TRUE
ssl_path / ssl_pwd SSL 证书路径 / 密码 —
mpp_login MPP 登录方式 GLOBAL
ukey_name / ukey_pin UKEY 登录 —
rwseparate 是否启用读写分离 FALSE
rwseparate_percent 读写分离比例(%) 25
cursor_rollback_behavior 回滚后游标状态 不关闭
lang_id 错误消息语言 中文
local_code 客户端编码 系统编码
cursorclass DictCursor / TupleCursor TupleCursor
schema 连接默认模式 登录用户默认模式
parse_type 语法解析模式 DM/TSQL/MYSQL DM
dmsvc_path dm_svc.conf 所在目录 —

3.3 配置优先级

接口参数与 dm_svc.conf 对应:login_timeout↔CONNECT_TIMEOUT、compress_msg↔COMPRESS_MSG、ssl_path/ssl_pwd↔SSL_CONFIG、rwseparate↔RW_SEPARATE、rwseparate_percent↔RW_PERCENT、local_code↔CHAR_CODE、lang_id↔LANGUAGE。优先级:全局配置区 < 接口设置 < 服务配置区。

4. 自动提交

autoCommit 默认 TRUE,与 cx_Oracle、pymysql 默认 False 不同,即连接后 DML 默认自动提交。事务性应用必须显式关闭:

conn = dmPython.connect(user='SYSDBA', password='Dmsys_123', server='127.0.0.1', port=5236, autoCommit=False) cursor = conn.cursor() try: cursor.execute("UPDATE t SET a = 1") conn.commit() except Exception: conn.rollback() finally: cursor.close() conn.close()

autoCommit 也可连接后动态调整:

conn.autoCommit # 1 conn.autoCommit = dmPython.DSQL_AUTOCOMMIT_OFF # 关闭 conn.autoCommit = dmPython.DSQL_AUTOCOMMIT_ON # 打开

Connection 支持上下文管理器,exit 关闭连接并回滚未提交事务:

with dmPython.connect(..., autoCommit=False) as conn: with conn.cursor() as cur: cur.execute("UPDATE t SET a = 1") conn.commit()

5. 参数绑定

paramstyle=‘qmark’,只支持 ? 按位置绑定,不支持 %s、:name:

cursor.execute("insert into test values(?, ?)", 1, 'abcdefg') cursor.execute("insert into test values(?, ?)", (99, 'today')) # 批量 Seq_params = [(1, 'a'), (2, 'b'), (3, 'c')] cursor.executemany("insert into test values(?, ?)", Seq_params)

参数个数少于绑定参数时按 None 补齐,多于时忽略。threadsafety=1,多线程每线程独立连接。

6. 类型映射

6.1 类型常量

dmPython 类型 达梦类型
NUMBER BYTE/TINYINT/SMALLINT/INT/INTEGER
BIGINT BIGINT
ROWID ROWID
DOUBLE FLOAT/DOUBLE/DOUBLE PRECISION
REAL REAL
DECIMAL NUMERIC/NUMBER/DECIMAL/DEC
STRING VARCHAR/VARCHAR2
FIXED_STRING CHAR/CHARACTER
BINARY / FIXED_BINARY VARBINARY / BINARY
BOOLEAN BIT
BLOB / CLOB BLOB / CLOB 大字段
BFILE / exBFILE BFILE
INTERVAL 日期间隔(不含年月间隔)
YEAR_MONTH_INTERVAL 年月间隔
TIMESTAMP TIMESTAMP、TIMESTAMP WITH LOCAL TIME ZONE
TIME_WITH_TIMEZONE TIME WITH TIME ZONE
TIMESTAMP_WITH_TIMEZONE TIMESTAMP WITH TIME ZONE
CURSOR 游标类型

6.2 需用字符串绑定的类型

Python 无对应类型的日期时间类型,插入用字符串:

  • YEAR TO MONTH:"INTERVAL '05-05' YEAR TO MONTH";
  • TIME WITH TIME ZONE:'09:10:21 +8:00';
  • TIMESTAMP WITH TIME ZONE:'2002-12-12 09:10:21 +8:00'。

6.3 大字段

大字段操作与字符串一样用 cursor.execute,最大 100G-1 字节。Python 3 以上 BLOB 返回 bytes、CLOB 返回 str;低于 3.0 版本 BLOB 返回 str、CLOB 返回 unicode。

cursor.execute('create table t_lob(c1 blob, c2 clob)') cursor.execute('insert into t_lob values(?, ?)', bvalue, cvalue) cursor.execute('select * from t_lob') row = cursor.fetchone() (blob, clob) = row

7. Connection 与 Cursor 接口

7.1 Connection 接口

接口 说明
commit() / rollback() 提交 / 回滚
close() / disconnect() 关闭连接
debug() 打开服务器调试
shutdown() 关闭服务器
explain(sql) 返回 SQL 执行计划
ping(reconnect) 检查连接可用性,reconnect 控制是否重连

7.2 Cursor 接口

接口 说明
callproc(procname, *args) 调用存储过程,名称大小写敏感
callfunc(funcname, *args) 调用存储函数,返回序列首元素为返回值
prepare(sql) 准备 SQL,后续可直接 execute
execute(sql, *args) 执行 SQL 并绑定参数
executedirect(sql) 执行 SQL,不支持参数绑定
executemany(sql, seq) 批量执行
fetchone / fetchmany / fetchall 获取结果
nextset() 获取下一个结果集
setinputsizes / setoutputsize 预定义参数空间
close() 关闭游标
# 调用存储过程 cursor.callproc('test_proc_2', 10000, 0) # 调用存储函数,返回值在结果序列第一个位置 cursor.callfunc('test_func_2', 10000, 0)

7.3 Cursor 属性

属性 说明
arraysize fetchmany 一次获取行数,默认 50
statement 最近一次执行的 SQL
with_rows 是否存在非空结果集
lastrowid 最近操作影响行的 rowid
execid SQL 执行号
description 结果集各列描述
column_names 结果集列名
rowcount 影响行数,无法确定返回 -1
rownumber 当前行号,从 0 开始

8. 连接池

from dbutils.pooled_db import PooledDB pool = PooledDB(creator=dmPython, user='SYSDBA', password='Dmsys_123', server='127.0.0.1', port=5236, autoCommit=False, mincached=2, maxcached=10) with pool.connection() as conn: with conn.cursor() as cur: cur.execute("INSERT INTO t VALUES (?, ?)", (1, 'a')) conn.commit()

DBUtils 提供 PersistentDB(持久连接)和 PooledDB(连接池)两种。

9. 错误处理

try: conn = dmPython.connect() cursor = conn.cursor() cursor.execute('create table t(c1 int)') except dmPython.Error as e: print("Error:%s" % str(e))
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服