本文將介紹如何使用 mysqlclient 和 OceanBase 數據庫構建一個應用程序,實現創建表、插入數據和查詢數據等基本操作。
前提條件
您已安裝 Python 3.x 和 pip。
您已安裝 OceanBase 數據庫并且創建了 MySQL 模式租戶。
操作步驟
檢查 Python 和 pip 的版本。
安裝 mysqlclient 庫。
獲取 OceanBase 數據庫連接信息。
修改
config.py
文件中的數據庫連接信息。運行
main.py
文件。在交互式命令行界面進行相應的操作。
步驟一:檢查 Python 和 pip 的版本
打開命令提示符或 PowerShell 終端,運行python --version
和pip --version
命令,確保 Python 和 pip 正常安裝。
示例如下:
PS C:\Windows\system32> python --version
Python 3.11.2
PS C:\Windows\system32> pip --version
pip 23.3.1 from C:\Users\xxx\AppData\Local\Programs\Python\Python311\Lib\site-packages\pip (python 3.11)
步驟二:安裝 mysqlclient 庫
在安裝 mysqlclient 庫時,需要編譯和鏈接 MySQL C API 來連接 OceanBase 數據庫。因此,需要安裝 MySQL Connector C 或者 MySQL C API 的開發文件,以便在編譯過程中使用。
Windows 環境
方法一:使用預編譯的二進制文件來安裝 mysqlclient 庫
在 Windows 上,您可以使用預編譯的二進制文件來安裝 mysqlclient 庫。從 Download files 下載與您的 Python 版本和操作系統平臺兼容的whl
文件,并使用pip install
命令來安裝。
示例如下:
打開命令提示符或 PowerShell 終端,運行以下命令,安裝必要的 Python 庫。
進入到存放
whl
文件的目錄。cd D:\download
運行以下命令,安裝 mysqlclient 庫。
PS D:\download> pip install mysqlclient-2.2.0-cp311-cp311-win_amd64.whl Processing d:\download\mysqlclient-2.2.0-cp311-cp311-win_amd64.whl Installing collected packages: mysqlclient Successfully installed mysqlclient-2.2.0
方法二:直接安裝 mysqlclient 庫
安裝 MySQL。
在使用 mysqlclient 之前,你需要先安裝 MySQL 數據庫服務器。mysqlclient 庫會依賴于 MySQL 的客戶端程序和庫文件,以便與 MySQL 進行通信。您可以從 MySQL 官方網站下載安裝程序,并按照指示進行安裝。
安裝 C 編譯器。
在 Windows 上安裝 C 編譯器,可以選擇安裝 Visual Studio 或者 MinGW。
安裝開發工具。
在 Windows上,你可以使用 MySQL Connector/C 來獲取 MySQL 的開發庫。您可以按照以下步驟來進行安裝 MySQL Connector/C:
打開 MySQL 官網下載 頁面。
在下載頁面中,選擇適合你的操作系統類型和版本,下載對應的安裝包。
運行下載的安裝包,按照安裝向導的提示進行安裝。
在安裝過程中,選擇 Custom 安裝類型,確保安裝了 Development Components。
安裝完成后,重新啟動計算機。
安裝 mysqlclient 庫。
打開命令提示符或 PowerShell 終端,運行以下命令,安裝必要的 Python 庫。
運行以下命令,進入代碼的
python-mysqlclient
目錄。cd python-mysqlclient
運行以下命令,安裝 mysqlclient 庫。
pip install -r requirements.txtB
說明您也可以直接運行
pip install mysqlclient
命令安裝 mysqlclient 庫。
Linux 環境
在 Linux 環境下,Python 的 C 擴展需要依賴 Python.h 頭文件,而這個頭文件通常包含在 python3-devel 包中。如果沒有安裝 python3-devel 包,則編譯 MySQL C API 時會出現找不到 Python.h 的錯誤。
打開命令提示符或 PowerShell 終端,運行以下命令,安裝必要的 Python 庫。
檢查是否安裝
python3-devel
。運行以下命令來檢查是否已安裝
python3-devel
包:rpm -q python3-devel
如果已安裝,則會輸出類似于以下內容的信息:
python3-devel-3.x.x-x.el7.x86_64
其中,3.x.x 表示 Python3 的版本號,x86_64 表示系統的 CPU 架構。
如果未安裝,則會輸出類似于以下內容的信息:
package python3-devel is not installed
此時可以通過以下命令來安裝
python3-devel
包:sudo yum install python3-devel
安裝完成后,再次運行
rpm -q python3-devel
命令來確認安裝是否成功。
安裝 mysqlclient 庫。
運行以下命令,進入到代碼的
python-mysqlclient
目錄。cd python-mysqlclient
運行以下命令,安裝項目所需的 Python 庫。
sudo pip install -r requirements.txt
說明您也可以直接運行
sudo pip install mysqlclient
命令安裝 mysqlclient 庫。
步驟三:獲取 OceanBase 數據庫連接信息
聯系 OceanBase 數據庫部署人員或者管理員獲取相應的數據庫連接串。
obclient -h$host -P$port -u$user_name -p$password -D$database_name
參數說明:
$host
:OceanBase 數據庫連接的域名。$port
:OceanBase 數據庫連接端口,MySQL 模式租戶默認是 3306。$database_name
:需要訪問的數據庫名稱。$user_name
:租戶的連接賬號。$password
:提供賬戶密碼。
更多連接串的信息,請參見 獲取連接參數。
示例如下:
obclient -hxxx.xxx.xxx.xxx -P3306 -utest_user001 -p****** -Dtest
步驟四:修改 config.py 文件中的數據庫連接信息
根據 步驟三:獲取 OceanBase 數據庫連接信息 中的信息修改文件python-mysqlclient/config.py
中的數據庫連接信息。
進入
python-mysqlclient
項目文件夾。修改
config.py
文件中的數據庫連接信息。在 Windows 環境下,使用文本編輯器打開
config.py
文件,修改文件中的數據庫連接信息,確保與實際情況相符。在 Linux 環境下,可以使用
vi config.py
或者vim config.py
命令編輯config.py
文件,修改文件中的數據庫連接信息,確保與實際情況相符。
config.py
文件中的數據庫連接信息示例如下:OCEANBASE_CONFIG = { 'host': 'xxx.xxx.xxx.xxx', 'port': 3306, 'user': 'test_user001', 'password': '******', 'database': 'test', 'charset': 'utf8mb4' }
步驟五:運行 main.py 文件
打開命令提示符或 PowerShell 終端,運行python main.py
命令啟動程序。
進入到
python-mysqlclient
項目目錄下。示例如下:
cd /home/admin/python-mysqlclient
運行以下命令啟動
main.py
程序。python main.py
返回結果如下:
Table created successfully Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
步驟六:在交互式命令行界面進行相應的操作
插入數據成功示例。
在交互式命令行界面,輸入指令
1
,按回車鍵。示例如下:
Enter the command [1/2/3]> 1
在提示
Enter name:
后,輸入姓名,按回車鍵。示例如下:
Enter name:A1
在提示
Enter age:
后,輸入年齡,按回車鍵。示例如下:
Enter age:18
返回插入數據成功,顯示
Record inserted successfully
。最后,顯示指令說明,提示用戶可以輸入1
、2
或3
,按回車鍵執行相應操作。示例如下:
Record inserted successfully Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
插入數據失敗示例。
在交互式命令行界面,輸入指令
1
,按回車鍵。示例如下:
Enter the command [1/2/3]> 1
在提示
Enter name:
后,輸入姓名,按回車鍵。示例如下:
Enter name:A2
在提示
Enter age:
后,輸入年齡,按回車鍵。說明字段年齡的數據類型是整型。
示例如下:
Enter age:十八
返回插入數據錯誤信息,顯示
(1366, 'Incorrect integer value')
。最后,顯示指令說明,提示用戶可以輸入1
、2
或3
,按回車鍵執行相應操作。示例如下:
(1366, 'Incorrect integer value') Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
查詢數據示例。
在交互式命令行界面,輸入指令
2
,按回車鍵。示例如下:
Enter the command [1/2/3]> 2
顯示表的數據。最后,顯示指令說明,提示用戶可以輸入
1
、2
或3
,按回車鍵執行相應操作。示例如下:
(1, 'A1', 18) Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
輸入錯誤指令示例。
在交互式命令行界面,輸入一個不是
1/2/3
的,按回車鍵。示例如下:
Enter the command [1/2/3]> A
返回錯誤信息,顯示
Invalid command, please enter command again [1/2/3]
。最后,顯示指令說明,提示用戶可以輸入1
、2
或3
,按回車鍵執行相應操作。示例如下:
Invalid command, please enter command again [1/2/3] Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
退出程序示例。
在交互式命令行界面,輸入指令
3
,按回車鍵退出程序。示例如下:
Enter the command [1/2/3]> 3
項目代碼介紹
點擊 python-mysqlclient 下載項目代碼,是一個名稱為python-mysqlclient.zip
的壓縮包。
解壓后,得到一個名為python-mysqlclient
的文件夾。目錄結構如下所示:
python-mysqlclient
├── config.py
├── db.py
├── main.py
└── requirements.txt
文件說明:
config.py
:用于管理數據庫連接配置信息。db.py
:用于操作數據庫,包括創建表、插入數據、查詢數據等。main.py
:應用程序的入口,包含了簡單的用戶交互界面,用戶可以通過輸入命令來執行相應的操作。requirements.txt
:列出了項目所需的 Python 庫。說明本文獲取的代碼中只列出了 mysqlclient 庫的版本要求,可以通過
pip install -r requirements.txt
命令安裝,執行以上命令后,會自動安裝所需的庫。
config.py 代碼介紹
使用 Python 連接數據庫時需要指定數據庫連接參數,可以將這些參數放在一個單獨的配置文件中,比如config.py
文件。將這些參數封裝在一個字典中,可以避免在每個文件中都重復寫入這些參數的麻煩,直接在其他 Python 文件中引用該字典來連接數據庫即可。
本文獲取的config.py
文件中的代碼定義了一個名為OCEANBASE_CONFIG
的字典變量,用于管理 OceanBase 數據庫連接參數。
代碼如下:
OCEANBASE_CONFIG = {
'host': 'localhost',
'port': port,
'user': 'user_name',
'password': '',
'database': 'db_name',
'charset': 'utf8mb4'
}
參數解釋:
host
:OceanBase 數據庫連接的域名。port
:提供 OceanBase 數據庫連接端口,默認端口是 3306。user
:提供租戶的連接賬戶。password
:提供賬戶密碼。database
:需要連接的數據庫名。charset
:連接數據庫時使用的字符集。
具體的屬性(參數)配置取決于項目需求和數據庫的特點,建議您根據實際情況進行調整和配置。
db.py 代碼介紹
db.py
文件是一個 Python 語言編寫的封裝數據庫操作的模塊,主要用于實現數據庫的增刪改查操作。
該文件中主要包括以下幾個部分:
導入 MySQLdb 模塊和導入數據庫連接參數。
代碼如下:
import MySQLdb from config import OCEANBASE_CONFIG
定義創建表的函數。
定義函數
create_table
,該函數的作用是在 OceanBase 數據庫中創建名為test_tbl1
的表。使用with
語句管理數據庫連接和游標對象的生命周期,保證了數據庫連接和游標對象的安全關閉,避免了內存泄漏等問題。定義 SQL 語句,執行 SQL 語句,打印輸出執行結果或異常信息。代碼如下:
def create_table(): with MySQLdb.connect(**OCEANBASE_CONFIG) as conn: with conn.cursor() as cursor: try: create_table_sql = """ CREATE TABLE test_tbl1 ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT UNSIGNED NOT NULL, PRIMARY KEY (id) ) ENGINE=OCEANBASE AUTO_INCREMENT=1 """ cursor.execute(create_table_sql) print("Table created successfully") except MySQLdb.Error as err: print(err)
定義插入數據的函數。
定義函數
insert_record
,該函數主要實現了向指定表中插入一條記錄,記錄包含name
和age
兩個字段。使用with
語句管理數據庫連接和游標對象的生命周期,保證了數據庫連接和游標對象的安全關閉,避免了內存泄漏等問題。定義 SQL 語句,執行插入操作,提交事務,打印輸出執行結果或異常信息。代碼如下:
def insert_record(table_name, name, age): with MySQLdb.connect(**OCEANBASE_CONFIG) as conn: with conn.cursor() as cursor: try: insert_sql = f"INSERT INTO {table_name} (name, age) VALUES (%s, %s)" cursor.execute(insert_sql, (name, age)) conn.commit() print("Record inserted successfully") except MySQLdb.Error as err: print(err)
定義查詢表數據的函數。
定義函數
select_all
,該函數主要實現了查詢指定表中的所有記錄的功能。使用with
語句管理數據庫連接和游標對象的生命周期,保證了數據庫連接和游標對象的安全關閉,避免了內存泄漏等問題。定義 SQL 語句,執行查詢操作并遍歷查詢結果,打印輸出所有記錄。如果發生異常,則捕捉異常并打印輸出異常信息。代碼如下:
def select_all(table_name): with MySQLdb.connect(**OCEANBASE_CONFIG) as conn: with conn.cursor() as cursor: try: select_sql = f"SELECT * FROM {table_name}" cursor.execute(select_sql) result = cursor.fetchall() for row in result: print(row) except MySQLdb.Error as err: print(err)
main.py 代碼介紹
本文中main.py
的主要作用是演示了如何使用 Python 和 MySQLdb 模塊來操作數據庫,并通過交互式命令行界面讓您進行相應的操作。您可以通過該程序來創建表、插入記錄和查詢所有記錄,從而實現了基本的數據庫操作。
該文件中主要包括以下幾個部分:
導入
db.py
文件中定義的函數。從 db 模塊中導入
create_table
、insert_record
和select_all
這三個函數。代碼如下:
from db import create_table, insert_record, select_all
定義一個函數,用于操作數據庫。
定義函數
main
,該函數實現了一個簡單的命令行交互式程序,用于操作數據庫。它首先調用create_table
函數創建名為test_tbl1
的表,然后進入一個while
循環,等待用戶輸入命令。根據用戶的選擇,程序調用不同的函數進行插入或查詢操作,直到用戶輸入3
命令退出程序。如果用戶輸入的是無效命令,則程序會提示用戶重新輸入。根據輸入的不同命令,程序執行不同的操作,包括插入數據(1)、查詢數據(2)和退出程序(3)。
代碼如下:
def main(): create_table() while True: print("Instruction: 1.Insert Data; 2.Query Data; 3.Exit.") command = input("Enter the command [1/2/3]> ") if command == "1": name = input("Enter name:") age = input("Enter age:") insert_record("test_tbl1", name, age) elif command == "2": select_all("test_tbl1") elif command == "3": break else: print("Invalid command, please enter command again [1/2/3]")
設置
main
函數的使用場景。設置只有當
main.py
被直接運行時,才會調用main
函數執行程序的主要邏輯。而如果該程序被導入到其他模塊中,則不會執行main
函數。代碼如下:
if __name__ == "__main__": main()
說明這種寫法可以避免在導入該模塊時自動執行
main
函數,從而保證程序的可重用性和可擴展性。
完整的代碼展示
config.py
OCEANBASE_CONFIG = {
'host': 'localhost',
'port': port,
'user': 'user_name',
'password': '',
'database': 'db_name',
'charset': 'utf8mb4'
}
db.py
import MySQLdb
from config import OCEANBASE_CONFIG
def create_table():
with MySQLdb.connect(**OCEANBASE_CONFIG) as conn:
with conn.cursor() as cursor:
try:
create_table_sql = """
CREATE TABLE test_tbl1 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT UNSIGNED NOT NULL,
PRIMARY KEY (id)
) ENGINE=OCEANBASE AUTO_INCREMENT=1
"""
cursor.execute(create_table_sql)
print("Table created successfully")
except MySQLdb.Error as err:
print(err)
def insert_record(table_name, name, age):
with MySQLdb.connect(**OCEANBASE_CONFIG) as conn:
with conn.cursor() as cursor:
try:
insert_sql = f"INSERT INTO {table_name} (name, age) VALUES (%s, %s)"
cursor.execute(insert_sql, (name, age))
conn.commit()
print("Record inserted successfully")
except MySQLdb.Error as err:
print(err)
def select_all(table_name):
with MySQLdb.connect(**OCEANBASE_CONFIG) as conn:
with conn.cursor() as cursor:
try:
select_sql = f"SELECT * FROM {table_name}"
cursor.execute(select_sql)
result = cursor.fetchall()
for row in result:
print(row)
except MySQLdb.Error as err:
print(err)
main.py
from db import create_table, insert_record, select_all
def main():
create_table()
while True:
print("Instruction: 1.Insert Data; 2.Query Data; 3.Exit.")
command = input("Enter the command [1/2/3]> ")
if command == "1":
name = input("Enter name:")
age = input("Enter age:")
insert_record("test_tbl1", name, age)
elif command == "2":
select_all("test_tbl1")
elif command == "3":
break
else:
print("Invalid command, please enter command again [1/2/3]")
if __name__ == "__main__":
main()
相關文檔
更多連接 OceanBase 數據庫的信息,請參見 連接方式概述。