Skip to main content

dm-pure:纯 Python 达梦 DM8 数据库驱动

零 native 依赖、100% Python 实现的达梦数据库驱动。支持达梦 DM8 常用功能,适合受限环境(无编译工具/无法加载 native 库的机器)。

特性

  • ✅ 连接:DH 密钥交换 + DES-CFB 加密登录(内置纯 Python 加密,零依赖)
  • ✅ 查询:SELECT / INSERT / UPDATE / DELETE,支持参数绑定(含 NULL)
  • ✅ 类型:INT / BIGINT / DECIMAL / DATE / TIME / DATETIME / TIME_TZ / DATETIME_TZ / DATETIME2 / DATETIME2_TZ(含时区偏移)/ INTERVAL / FLOAT / 中文等
  • ✅ 字符集:自动检测服务器编码(GB18030 / UTF-8 / EUC-KR),也可手动指定,中文读写不乱码
  • ✅ 大结果集:分批 fetch(cmd=7)
  • ✅ LOB:CLOB / BLOB 读写(含大 LOB 分段传输)
  • ✅ 事务:begin / commit / rollback / 隔离级别 / with c.transaction(): 上下文管理器
  • ✅ DSN:DMClient.from_dsn("dm://user:pwd@host:port/?encoding=utf8")
  • ✅ 事务:begin / commit / rollback / 隔离级别
  • ✅ 存储过程:CALL + IN/OUT 参数
  • ✅ 批量插入:executemany(协议级 batch)
  • ✅ 连接池:线程安全,自动重连
  • ✅ DB-API 2.0 兼容层:惰性游标(fetchone/fetchmany/fetchall 按需拉取)
  • ✅ 健壮性:超时控制、断线重连、错误码表

安装

pip install dm-pure

零依赖:加密算法(DES/AES/RC4)内置纯 Python 实现。若环境已安装 pycryptodome 会自动优先使用(性能更优),否则用内置实现,功能完全一致。

快速上手

底层 API

from dmpy import DMClient

c = DMClient("127.0.0.1", 5236, "SYSDBA", "password")   # 默认自动检测服务器字符集
c = DMClient(..., encoding="UTF-8")                       # 也可手动指定编码
c.connect()
c.execute("SELECT id, name FROM t WHERE id = ?", [1])     # → (cols, rows)
c.execute("INSERT INTO t VALUES (?, ?)", [1, "x"])        # → (None, 影响行数)
c.begin(); c.execute(...); c.commit()                     # 事务
c.close()

中文/字符集支持

达梦 DM8 服务器初始化时可指定字符集(GB18030 或 UTF-8 等),服务器在握手响应参数区偏移 28 (int32:1=UTF8, 2=EUCKR, 其他=GB18030,对照 Go 驱动 zq.go Dm_build_1282=28)告知客户端。

  • 默认自动检测DMClient(host, port, user, pwd)encoding=None)连接握手时读取偏移 28 并 切换到对应编码,SQL 文本、参数绑定、结果集、CLOB 读写在检测后统一按该编码编解码。
  • 手动覆盖DMClient(..., encoding="UTF-8") 强制指定(服务器不返回编码或需要特殊处理时使用)。

中文乱码的根因:服务器为 UTF-8 而客户端固定按 GB18030 编解码(或反之)。 旧版驱动硬编码 GB18030;本版握手时自动适配,GB18030 服务器行为与旧版完全一致。

已知限制

  1. XDEC_INT32 / XDEC_INT64(24/25):达梦内部类型,返回原始 bytes(Go 驱动同样回退)。
  2. 超大结果集:cmd=7 只发一次拉取(请求带 maxRows=INT64_MAX),未对响应"还有更多" 标志(0xFFFF)做循环验证;实测中量级结果正常,建议对 >6 万行结果集做回归。
  3. 连接池:每次 acquire 都执行 SELECT 1 保活检查,高频借还场景有网络开销。
  4. TZ 参数绑定:TZ 类型目前仅支持读取(解码带 tzinfo),参数绑定仍按普通 TIME/DATETIME。
  5. 发送帧间 2ms sleep 无条件_send 固定 0.002s,Rust 版可配置 send_delay=0)。

已修复:时区类型(TIME_TZ/DATETIME_TZ/DATETIME2/DATETIME2_TZ)完整解码(含时区偏移); DML 影响行数改为 int64(>65535 不截断,对照 Go Dm_build_354); 事务中断线不再静默重连(明确报错,防未提交事务丢失)。

DB-API 2.0(sqlite3/pymysql 风格)

import dmpy.dbapi as dm

conn = dm.connect(host="127.0.0.1", port=5236, user="SYSDBA", password="...")
cur = conn.cursor()
cur.execute("SELECT id, name FROM t WHERE id >= ?", [1])
rows = cur.fetchall()          # 大结果集自动分批拉取
cur.executemany("INSERT INTO t VALUES (?, ?)", [[1, "a"], [2, "b"]])
conn.commit()
conn.close()

存储过程

from dmpy import DMClient, OUT

c = DMClient("127.0.0.1", 5236, "SYSDBA", "password")
c.connect()
r = c.execute("CALL sp_test(?, ?, ?, ?)", [5, "hello", OUT(int), OUT(str)])
print(r[2])  # → [10, "hello"](OUT 参数返回值)

连接池

from dmpy.pool import ConnectionPool

pool = ConnectionPool(host="127.0.0.1", port=5236, user="SYSDBA", password="...",
                      min_connections=2, max_connections=10)
with pool.connection() as conn:
    cur = conn.cursor()
    cur.execute("SELECT 1")
pool.close()

大 LOB

# 写入 1MB CLOB/BLOB(自动分段传输)
c.execute("INSERT INTO t (id, content, data) VALUES (?, ?, ?)",
          [1, "大文本..." * 50000, b"\x00\x01..." * 100000])
# 读取(自动完整拉取)
rows = c.execute("SELECT content, data FROM t WHERE id = ?", [1])[1]

项目结构

dmpy/
├── client.py       # 核心:连接/查询/参数绑定/LOB/事务/存储过程/惰性查询
├── crypto.py       # 加密(内置纯 Python + 可选 pycryptodome)
├── _pure_crypto.py # 纯 Python DES/AES/RC4 实现
├── frame.py        # 协议帧封装/解析
├── result.py       # 列描述符/行数据/类型解码
├── dbapi.py        # DB-API 2.0 兼容层
└── pool.py         # 连接池

环境要求

  • Python >= 3.8
  • 可达的达梦 DM8 服务器(TCP 5236 端口)

测试

python test_all.py   # 22 项回归断言(需可达的达梦服务器,修改 test_all.py 中的连接参数)

发布

发布到 PyPI 的流程见 PUBLISHING.md

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dm_pure-1.1.0-cp312.py3-none-any.whl (69.5 kB view details)

Uploaded CPython 3.12Python 3

dm_pure-1.1.0-cp311.py3-none-any.whl (72.7 kB view details)

Uploaded CPython 3.11Python 3

dm_pure-1.1.0-cp310.py3-none-any.whl (47.7 kB view details)

Uploaded CPython 3.10Python 3

dm_pure-1.1.0-cp39.py3-none-any.whl (47.4 kB view details)

Uploaded CPython 3.9Python 3

dm_pure-1.1.0-cp38.py3-none-any.whl (47.3 kB view details)

Uploaded CPython 3.8Python 3

File details

Details for the file dm_pure-1.1.0-cp312.py3-none-any.whl.

File metadata

  • Download URL: dm_pure-1.1.0-cp312.py3-none-any.whl
  • Upload date:
  • Size: 69.5 kB
  • Tags: CPython 3.12, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.13

File hashes

Hashes for dm_pure-1.1.0-cp312.py3-none-any.whl
Algorithm Hash digest
SHA256 7532f47bc6556cc0dc60d7eb644aec766d87da5ea128f451e7eb1a19e95af473
MD5 f60efc70dba31dc7edb0d808067748c0
BLAKE2b-256 930fb456fc5f8ca5285b205a4052f4e779940ed23f24284034aff0a68455c060

See more details on using hashes here.

File details

Details for the file dm_pure-1.1.0-cp311.py3-none-any.whl.

File metadata

  • Download URL: dm_pure-1.1.0-cp311.py3-none-any.whl
  • Upload date:
  • Size: 72.7 kB
  • Tags: CPython 3.11, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.15

File hashes

Hashes for dm_pure-1.1.0-cp311.py3-none-any.whl
Algorithm Hash digest
SHA256 b26102520e7ee164ca938ccf15fd85c3a6d6998145158ca848c1c9daf085e29c
MD5 e07d7634949a7ae2bdd729e1aa9d2f93
BLAKE2b-256 3be5de1729fb9002dd0bbdde7f5efda26035c66b0b481dfc31ae76a3b5ab82d2

See more details on using hashes here.

File details

Details for the file dm_pure-1.1.0-cp310.py3-none-any.whl.

File metadata

  • Download URL: dm_pure-1.1.0-cp310.py3-none-any.whl
  • Upload date:
  • Size: 47.7 kB
  • Tags: CPython 3.10, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.10.20

File hashes

Hashes for dm_pure-1.1.0-cp310.py3-none-any.whl
Algorithm Hash digest
SHA256 5229ed76c867cebc6dd49f26d120828629780f2ab323464ab6fb0e8cd7cbb6c1
MD5 a1764bb797033809c9bc813193f7bfb4
BLAKE2b-256 b4a426644f667aa4c5b2f3368eef7f9c99213eeb283d8cd62f04b40bfd6667d5

See more details on using hashes here.

File details

Details for the file dm_pure-1.1.0-cp39.py3-none-any.whl.

File metadata

  • Download URL: dm_pure-1.1.0-cp39.py3-none-any.whl
  • Upload date:
  • Size: 47.4 kB
  • Tags: CPython 3.9, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for dm_pure-1.1.0-cp39.py3-none-any.whl
Algorithm Hash digest
SHA256 daa7693d79f2e87f24dd5b87522bb57ed141ba8235bedb725977bf26e6af2fa6
MD5 dce258a336e799c8f32977c2a0ddae4e
BLAKE2b-256 e66d3b7f11c7dee24121683a02b26740dd3e982d8cf7c389b01f51f41f193597

See more details on using hashes here.

File details

Details for the file dm_pure-1.1.0-cp38.py3-none-any.whl.

File metadata

  • Download URL: dm_pure-1.1.0-cp38.py3-none-any.whl
  • Upload date:
  • Size: 47.3 kB
  • Tags: CPython 3.8, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.20

File hashes

Hashes for dm_pure-1.1.0-cp38.py3-none-any.whl
Algorithm Hash digest
SHA256 e2c08e5581042fbc9eddfa841791ddafa1e24f2966f82693b2ff0aa8683d5638
MD5 b39d43c09c0a99b30dd6fddb0779a009
BLAKE2b-256 9b516a83f2c678fbfbbc523e5e6e05fe1d49cedd2ee092075ddf0e057261a68b

See more details on using hashes here.

Release history Release notifications | RSS feed

1.3.5

1 file

1.3.4

1 file

1.3.3

1 file

1.3.2

1 file

1.3.1

1 file

1.3.0

1 file

1.2.2

1 file

1.2.1

1 file

1.2.0

5 files

This release

1.1.0 This release

5 files

1.0.2

5 files

1.0.1

5 files

1.0.0

5 files

0.1.5

5 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page