1. 程式人生 > >pyodbc操作Access資料庫

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,表示尚未安裝。

ODBC資料來源

這樣一來準備工作就結束了。

建立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檔案重新建立了一個,就能完美運行了。