dmPython 是达梦依循 Python DB API 2.0 开发的接口,通过调用 DPI 完成扩展。除 Python 标准库外还需 DPI 运行环境。
模块常量:
| 常量 | 值 | 含义 |
|---|---|---|
| apilevel | ‘2.0’ | 支持的 DB API 版本 |
| threadsafety | 1 | 线程可共享模块,但不能共享连接 |
| paramstyle | ‘qmark’ | 只支持 ? 位置绑定 |
离线安装:先装达梦数据库或下载驱动压缩包,再配置环境变量——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。
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” 五个关键字,省略只能从后往前依次省略。
| 关键字 | 说明 | 默认值 |
|---|---|---|
| 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 所在目录 | — |
接口参数与 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。优先级:全局配置区 < 接口设置 < 服务配置区。
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()
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,多线程每线程独立连接。
| 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 | 游标类型 |
Python 无对应类型的日期时间类型,插入用字符串:
"INTERVAL '05-05' YEAR TO MONTH";'09:10:21 +8:00';'2002-12-12 09:10:21 +8:00'。大字段操作与字符串一样用 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
| 接口 | 说明 |
|---|---|
| commit() / rollback() | 提交 / 回滚 |
| close() / disconnect() | 关闭连接 |
| debug() | 打开服务器调试 |
| shutdown() | 关闭服务器 |
| explain(sql) | 返回 SQL 执行计划 |
| ping(reconnect) | 检查连接可用性,reconnect 控制是否重连 |
| 接口 | 说明 |
|---|---|
| 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)
| 属性 | 说明 |
|---|---|
| arraysize | fetchmany 一次获取行数,默认 50 |
| statement | 最近一次执行的 SQL |
| with_rows | 是否存在非空结果集 |
| lastrowid | 最近操作影响行的 rowid |
| execid | SQL 执行号 |
| description | 结果集各列描述 |
| column_names | 结果集列名 |
| rowcount | 影响行数,无法确定返回 -1 |
| rownumber | 当前行号,从 0 开始 |
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(连接池)两种。
try:
conn = dmPython.connect()
cursor = conn.cursor()
cursor.execute('create table t(c1 int)')
except dmPython.Error as e:
print("Error:%s" % str(e))
文章
阅读量
获赞
