pyodbc操作Access資料庫
現在各種各樣的資料庫層出不窮,什麼MySQL、PostgreSQL、MongoDB這些都是比較火的,還有一些稍微小眾一點的資料庫就更多了。相比之下,微軟Office套件裡面附帶的Access資料庫究落寞了很多。不過好歹Access資料庫還是有些用處的,作為一個既是資料庫又是前端介面的軟體,對一些非科班又有資料庫需求的人來說還是比較好用的。本文利用pyodbc來簡單介紹一下如何操作Access資料庫。
安裝pyodbc
最簡單的方式自然是pip安裝了:
pip install pyodbc
如果會使用pipenv的話就更好了,一整套Python虛擬環境管理方案,強烈推薦:
pipenv install pyodbc
最近又瞭解了一下faker類庫,所以順便用faker添加了一些模擬資料。所以順便還要安裝faker:
pip install faker
安裝Access資料庫引擎
Access資料庫稍微有點特殊,還需要安裝一個額外的資料庫引擎。注意版本要和安裝的Office版本一樣,如果安裝的Office是32位而安裝了64位的引擎,也沒辦法使用。如果安裝的是Office 2019的話,用2016引擎就好了。其他版本的沒試過。
安裝完畢後開啟ODBC資料來源,檢視一下平臺,如果顯示出了具體位數,說明安裝成功。當然沒安裝以前也可以先檢視一下,應該是N/A,表示尚未安裝。
這樣一來準備工作就結束了。
建立Access資料庫
首先開啟Access軟體,建立一個數據庫。建立完畢後記得關閉資料庫,否則接下來程式碼會報錯。
增刪查改
pyodbc庫的用法和一般的Python SQL驅動類似,我就不做過多介紹了,很簡單的示例程式碼,做了一些簡單註釋。首先建立了3000條使用者資料,然後簡單查詢了一下所有公務員。資料庫欄位完全按照faker提供的模擬資料來設計的。程式碼只用了簡單的SQL新增和查詢功能,不過更新和刪除也很簡單,就不寫了。
import pyodbc
import faker
create_table_sql = '''\
create table user
(
id autoincrement primary key,
username varchar(255) unique,
nickname varchar(255) not null,
password varchar(20) not null,
address varchar(255),
birthday date,
company varchar(30),
job varchar(20),
telephone varchar(14)
)
'''
insert_table_sql = '''\
insert into user(username, nickname, password, address, birthday, company, job, telephone)
values (?, ?, ?, ?, ?, ?, ?, ?)
'''
select_public_servant_sql = '''\
select *
from user
where job = '公務員'
'''
# 準備模擬資料
fake = faker.Faker('zh_CN')
# 設定種子值,不設的話每次隨機的都不一樣
fake.seed(47)
db_file_location = r'D:\desktop\db.accdb'
# 這裡用的是Python3.5的語法,如果是低版本Python的話需要改成普通方式
connection = pyodbc.connect(
rf'Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={db_file_location};')
connection.autocommit = True
# 第一次建立表,將其設定為False
table_exists = False
if not table_exists:
with connection.cursor() as cursor:
cursor.execute(create_table_sql)
# 新增資料
with connection.cursor() as cursor:
for _ in range(3000):
cursor.execute(insert_table_sql, (fake.pystr(min_chars=6, max_chars=10),
fake.name(),
fake.password(length=10),
fake.address(),
fake.date_of_birth(minimum_age=0, maximum_age=120),
fake.company(),
fake.job(),
fake.phone_number()))
# 查詢一下所有公務員
cursor.execute(select_public_servant_sql)
results = cursor.fetchall()
for row in results:
print(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], sep='\t')
程式碼完成之後,開啟Access資料庫看一下,效果很完美,幾乎和真的一樣(滑稽)。當然這只是簡單的演示了一下,感覺對於一些簡單的專案,又希望能直接檢視資料庫內容,可以考慮一下Access資料庫。
一開始我在研究的時候,還出現了Database you are trying to open requires a newer version of Microsoft Access
這麼一個錯誤,我還有點納悶,我明明用的已經是Access 2019了,為啥還提示我需要更新版本的Access。最後發現可能是我一開始程式碼寫的有問題,或者是忘了關閉資料庫,導致的資料庫檔案損壞了。刪掉了原來的accdb檔案重新建立了一個,就能完美運行了。