本文将介绍如何使用 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 数据库的信息,请参见 连接方式概述。