【Python】获取Access数据库的表和字段

背景

  • 主要使用Access的大公司

  • 许多Access文件(数据库)分散在各个部门。

  • 无法一眼看出引用的项目在哪里,所以只好随意打开一个Access文件。

目标

  • 学习Python

  • 获取Access(数据库名称)、表名称和项目名称

程序

导入要用的库。

pip install pyodbc

pyodbc 用于从 Python 将 ODBC 连接到任何数据库的库 这次,将使用它来连接AccessDB。

运行下面的 Python 代码。

import pyodbc
import tkinter as tk
from tkinter import ttk    
from tkinter import filedialog as fd

def 处理(): 
    
    Fichier = fd.askopenfilename(
        filetypes=[("Microsoft Access", "*.accdb")],
        title='打开文件')# 获取文件路径
    
    # DB文件路径规范
    db_paths = []
    db_paths.append(Fichier)
    #db_paths.append(r'D:\HR\薪资\薪资分析.accdb')

    for db_path in db_paths:
        # 数据库连接
        con_str = (
            'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
            f'DBQ={db_path};'
        )
        conn = pyodbc.connect(con_str)
        cursor = conn.cursor()

        #拆分文件路径名
        split_path = db_path.rsplit('\\',2)
        
        #text中行的回车
        nl = '\n'

        # 获取数据库中的表
        texto.delete('1.0', tk.END)
        for table_info in cursor.tables(tableType='TABLE'):            
            texto.insert(tk.INSERT, f'{nl}{table_info.table_name}')# 表名输出 
            # 获取表中的列名(+1行数据)
            result = conn.execute(f'SELECT TOP 1 * FROM [{table_info.table_name}]')

            # 获取所有列元数据组
            columns_metadatas = result.description

            # 一次浏览一栏
            for column_metadatas in columns_metadatas:
                texto.insert(tk.INSERT, f'{nl}{column_metadatas[0]}')# 元数据组中,列名(0)

        # 关闭数据库
        cursor.close()
        conn.close()

##### create the root window    
root = tk.Tk()
root.title(' access的table和field')
root.resizable(False, False)
root.geometry('600x660+630+300')# (宽度x高度)+(x轴+y轴)

宽度=13
高度=25
左右内距=8
上下内距=3
左右间距=2
上下间距=3

#### 文本entry
## 文本entry label creation
lb_texto = tk.Label(root,width =宽度,padx=左右间距,pady=上下间距,text="texto")
texto之texto = tk.StringVar()
#エントリ2 = ttk.Entry(root,width = 宽度+3)
texto=tk.Text(root,width=39, height=18, wrap="word")#text才能换行(通过wrap="word",entry不能)

lb_texto.grid(column=0,row=18, sticky="e")
texto.grid(column=1,row=18,padx=左右间距, ipadx = 12, ipady = 128, sticky="w")   

##### 处理 button
bouton = ttk.Button(root,text=f'选择文件生成',width = 宽度+3,command=处理) #commdand引用def『作图』
bouton.grid(column=5, row=0, rowspan=8, ipadx=1, ipady=8, padx=左右间距, sticky="e")

##### run the application
root.mainloop()

执行结果

执行结果将输出如下所示。
可以查看哪个数据库包含哪些表和项目。
在这里插入图片描述

代码解释(部分摘录)

#分割文件路径名
     split_path = db_path.rsplit('\\',2)

使用 rsplit() 拆分文件路径名(例如 C:\AAA\BBB\database1.accdb)。
在 Windows 上,除非使用“\”(两个反斜杠),否则将会发生错误。

# 获取表中的列名(仅+1行数据)
     result = conn.execute(f'SELECT TOP 1 * FROM [{table_info.table_name}]')

最后,我们只需要获取列名,因此我们将数据限制为只有一行“TOP 1”。
SELECT语句中的[ ]是为了避免Access表名引起的错误。

# 获取所有列的元数据组
         columns_metadata = result.description

         # 一次浏览一栏
         for column_metadatas in columns_metadatas:
             texto.insert(tk.INSERT, f'{nl}{column_metadatas[0]}')# 元数据组中,列名(0)

描述属性用于获取列名称。

description属性的解释如下:
包含有关列的元数据。
例如,要获取“类型”信息,请指定 [1]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allan_lam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值