达梦 ODBC 配置
这个网上都有对应教程,此处不做过多赘述。
达梦数据库最麻烦的点在于,如果不是本用户创建的对应的模式数据库,无法直接像 SQLServer 、MySQL 一样直接查询。
如果对达梦数据库的模式和用户还不熟悉可以先阅读他们的技术文档。达梦 SQL 数据库技术文档
pyodbc
注:我的方法不适用于大型数据库的查询,大型数据表需要自己进行数据库优化。
数据库优化
通过 pip install pyodbc
直接安装 odbc 连接第三方库。
pyodbc 主要通过游标进行数据库查询,依赖 SQL 查询语句,对于过大的数据表时,可考虑设计数据库和 SQL 查询语句进行优化。
查询所有表格
达梦数据库的查询不会根据不同的表空间进行划分,查询后返回的是所有表空间中的表信息。(达梦数据库的表空间类似 SQL Server 中的数据库,但有不同)
SQL 语句 | 作用 |
---|---|
SELECT * FROM SYS.DBA_TABLES | 所有表,包括系统表 |
SELECT * FROM SYS.USER_TABLES | 所有用户表,就是当前用户能够管理的表 |
SELECT * FROM SYS.ALL_TABLES | 所有表,包括系统表 |
因为我的表格是通过达梦自动创建的实例,所以里面的表我都没办法直接访问。
我只能通过 owner(模式).table,需要通过 dab_tables
获取对应的 owner
属性名称。
SELECT OWNER、TABLE_NAME FROM SYS.DBA_TABLES;
里面还含有系统表和临时表,通过user_tables
表格进行过滤
SELECT OWNER,TABLE_NAME FROM SYS.DBA_TABLES WHERE TABLE_NAME in (SELECT TABLE_NAME from SYS.USER_TABLES) and TEMPORARY = 'N';
通过以上查询就能得到我们数据库中所有的自己创建的表,不区分表空间。
建议通过 模式 + 表名 来读取数据,能更大程度上避免登录用户的名称和模式名不同引起的冲突
SELECT * FROM OWNER.TABLE WHERE a = 'b';
import pyodbc
print([x for x in pyodbc.drivers() if x.startswith('DM8 ODBC DRIVER')])
# 替换为你的 SQL Server 连接信息
dsn = 'your_dm_odbc_name'
# 构建连接字符串
connection = pyodbc.connect(f'DSN={dsn};' + 'DRIVER={DM8 ODBC DRIVER};')
# 创建游标
cursor = connection.cursor()
# 获取所有表格的名称
table_names = []
# 这里的查询语句根据自己需要进行对应的 SQl 查询语句优化
query = "SELECT OWNER,TABLE_NAME FROM SYS.DBA_TABLES WHERE TABLE_NAME in " \
"(SELECT TABLE_NAME from SYS.USER_TABLES) and TEMPORARY = 'N';"
# 执行查询
cursor.execute(query)
tables = cursor.fetchall()
# 打印表格名称
print("Tables in the database:")
for table_name in tables:
table_name = '.'.join(table_name)
query = "SELECT * FROM {}".format(table_name)
cursor.execute(query)
table_info = cursor.description
t = cursor.fetchall()
print(table_name)
print(table_info)
print(t)
# 关闭连接
connection.close()