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 / FLOAT / 中文等
  • ✅ 字符集:自动检测服务器编码(GB18030 / UTF-8 / EUC-KR),也可手动指定,中文读写不乱码
  • ✅ 大结果集:分批 fetch(cmd=7)
  • ✅ LOB:CLOB / BLOB 读写(含大 LOB 分段传输)
  • ✅ 事务: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 服务器行为与旧版完全一致。

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.0.1-cp312.py3-none-any.whl (65.7 kB view details)

Uploaded CPython 3.12Python 3

dm_pure-1.0.1-cp311.py3-none-any.whl (68.8 kB view details)

Uploaded CPython 3.11Python 3

dm_pure-1.0.1-cp310.py3-none-any.whl (45.0 kB view details)

Uploaded CPython 3.10Python 3

dm_pure-1.0.1-cp39.py3-none-any.whl (44.7 kB view details)

Uploaded CPython 3.9Python 3

dm_pure-1.0.1-cp38.py3-none-any.whl (44.6 kB view details)

Uploaded CPython 3.8Python 3

File details

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

File metadata

  • Download URL: dm_pure-1.0.1-cp312.py3-none-any.whl
  • Upload date:
  • Size: 65.7 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.0.1-cp312.py3-none-any.whl
Algorithm Hash digest
SHA256 d3c6a0c8cd1a3c055dabe1dd35059ef9d86fd42515f9a65398b62f8e1cc93c08
MD5 4475451c5c3301bfc06b8f547b5f4ce3
BLAKE2b-256 e5b66ad04d868c11c932dbb40b6ef0aba228ee97e3bf6d72ad635e37120a8699

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dm_pure-1.0.1-cp311.py3-none-any.whl
  • Upload date:
  • Size: 68.8 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.0.1-cp311.py3-none-any.whl
Algorithm Hash digest
SHA256 b60b71715588a245cf885906493101aeac9450e6b1a8af31a517204f8ba2d421
MD5 4e9d10433a7d135f662e6fa329fb335d
BLAKE2b-256 e8166d6b4ee34d478f5494e19031eb7e78c35e7f173d2f4d40d5394e3faf3f8c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dm_pure-1.0.1-cp310.py3-none-any.whl
  • Upload date:
  • Size: 45.0 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.0.1-cp310.py3-none-any.whl
Algorithm Hash digest
SHA256 6b2f54fc46a787ebefe0d7f6077975fd6f7122ea4d4e7dc9182713948825f7ad
MD5 e9ec805f1d7f71ebafda0ae239705d92
BLAKE2b-256 708a0d6ba1023a2056554723dcfd9b111261d85abe403df26550ce8c0143d964

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dm_pure-1.0.1-cp39.py3-none-any.whl
  • Upload date:
  • Size: 44.7 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.0.1-cp39.py3-none-any.whl
Algorithm Hash digest
SHA256 2138430b91ba360570798e0778c7f29cda1a14c86bbca01162dc89ae508023bc
MD5 770c9bb0334589a8970d3219026900b2
BLAKE2b-256 4f05c2a7c7298989b67a957f8a98375cb505634a007b8ba5086d5462b0566456

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dm_pure-1.0.1-cp38.py3-none-any.whl
  • Upload date:
  • Size: 44.6 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.0.1-cp38.py3-none-any.whl
Algorithm Hash digest
SHA256 dd40de60e127ea5b7a45212c656f2c2e791bdc023dbc5bc641314220ae635497
MD5 9f9f905bd388e923635d45b4952f84a9
BLAKE2b-256 463a2ea59dbb5018695f8cc17a3f6674e4aeffa6606a7e31a1f4c044f6e62077

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

1.1.0

5 files

1.0.2

5 files

This release

1.0.1 This release

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