背景
-
主要使用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]。