mysqlclient 连接 OceanBase 数据库

本文将介绍如何使用 mysqlclient 和 OceanBase 数据库构建一个应用程序,实现创建表、插入数据和查询数据等基本操作。

image.png点击下载 python-mysqlclient 示例工程

前提条件

  • 您已安装 Python 3.x 和 pip。

  • 您已安装 OceanBase 数据库并且创建了 MySQL 模式租户。

操作步骤

  1. 检查 Python 和 pip 的版本。

  2. 安装 mysqlclient 库。

  3. 获取 OceanBase 数据库连接信息。

  4. 修改config.py文件中的数据库连接信息。

  5. 运行main.py文件。

  6. 在交互式命令行界面进行相应的操作。

步骤一:检查 Python 和 pip 的版本

打开命令提示符或 PowerShell 终端,运行python --versionpip --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 库。

  1. 进入到存放whl文件的目录。

    cd D:\download
  2. 运行以下命令,安装 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 库

  1. 安装 MySQL。

    在使用 mysqlclient 之前,你需要先安装 MySQL 数据库服务器。mysqlclient 库会依赖于 MySQL 的客户端程序和库文件,以便与 MySQL 进行通信。您可以从 MySQL 官方网站下载安装程序,并按照指示进行安装。

  2. 安装 C 编译器。

    在 Windows 上安装 C 编译器,可以选择安装 Visual Studio 或者 MinGW。

  3. 安装开发工具。

    在 Windows上,你可以使用 MySQL Connector/C 来获取 MySQL 的开发库。您可以按照以下步骤来进行安装 MySQL Connector/C:

    1. 打开 MySQL 官网下载 页面。

    2. 在下载页面中,选择适合你的操作系统类型和版本,下载对应的安装包。

    3. 运行下载的安装包,按照安装向导的提示进行安装。

    4. 在安装过程中,选择 Custom 安装类型,确保安装了 Development Components

    5. 安装完成后,重新启动计算机。

  4. 安装 mysqlclient 库。

    打开命令提示符或 PowerShell 终端,运行以下命令,安装必要的 Python 库。

    1. 运行以下命令,进入代码的python-mysqlclient目录。

      cd python-mysqlclient
    2. 运行以下命令,安装 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 库。

  1. 检查是否安装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命令来确认安装是否成功。

  2. 安装 mysqlclient 库。

    1. 运行以下命令,进入到代码的python-mysqlclient目录。

      cd python-mysqlclient
      
    2. 运行以下命令,安装项目所需的 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

参数说明:

  • $hostOceanBase 数据库连接的域名。

  • $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中的数据库连接信息。

  1. 进入python-mysqlclient项目文件夹。

  2. 修改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命令启动程序。

  1. 进入到python-mysqlclient项目目录下。

    示例如下:

    cd /home/admin/python-mysqlclient
  2. 运行以下命令启动main.py程序。

    python main.py

    返回结果如下:

    Table created successfully
    Instruction: 1.Insert Data; 2.Query Data; 3.Exit.
    Enter the command [1/2/3]>

步骤六:在交互式命令行界面进行相应的操作

  • 插入数据成功示例。

    1. 在交互式命令行界面,输入指令1,按回车键。

      示例如下:

      Enter the command [1/2/3]> 1
    2. 在提示Enter name:后,输入姓名,按回车键。

      示例如下:

      Enter name:A1
    3. 在提示Enter age:后,输入年龄,按回车键。

      示例如下:

      Enter age:18
    4. 返回插入数据成功,显示Record inserted successfully。最后,显示指令说明,提示用户可以输入123,按回车键执行相应操作。

      示例如下:

      Record inserted successfully
      Instruction: 1.Insert Data; 2.Query Data; 3.Exit.
      Enter the command [1/2/3]>
  • 插入数据失败示例。

    1. 在交互式命令行界面,输入指令1,按回车键。

      示例如下:

      Enter the command [1/2/3]> 1
    2. 在提示Enter name:后,输入姓名,按回车键。

      示例如下:

      Enter name:A2
    3. 在提示Enter age:后,输入年龄,按回车键。

      说明

      字段年龄的数据类型是整型。

      示例如下:

      Enter age:十八
    4. 返回插入数据错误信息,显示(1366, 'Incorrect integer value')。最后,显示指令说明,提示用户可以输入123,按回车键执行相应操作。

      示例如下:

      (1366, 'Incorrect integer value')
      Instruction: 1.Insert Data; 2.Query Data; 3.Exit.
      Enter the command [1/2/3]>
  • 查询数据示例。

    1. 在交互式命令行界面,输入指令2,按回车键。

      示例如下:

      Enter the command [1/2/3]> 2
    2. 显示表的数据。最后,显示指令说明,提示用户可以输入123,按回车键执行相应操作。

      示例如下:

      (1, 'A1', 18)
      Instruction: 1.Insert Data; 2.Query Data; 3.Exit.
      Enter the command [1/2/3]>
  • 输入错误指令示例。

    1. 在交互式命令行界面,输入一个不是1/2/3的,按回车键。

      示例如下:

      Enter the command [1/2/3]> A
    2. 返回错误信息,显示Invalid command, please enter command again [1/2/3]。最后,显示指令说明,提示用户可以输入123,按回车键执行相应操作。

      示例如下:

      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'
}

参数解释:

  • hostOceanBase 数据库连接的域名。

  • port:提供 OceanBase 数据库连接端口,默认端口是 3306。

  • user提供租户的连接账户。

  • password提供账户密码。

  • database:需要连接的数据库名。

  • charset:连接数据库时使用的字符集。

重要

具体的属性(参数)配置取决于项目需求和数据库的特点,建议您根据实际情况进行调整和配置。

db.py 代码介绍

db.py文件是一个 Python 语言编写的封装数据库操作的模块,主要用于实现数据库的增删改查操作。

该文件中主要包括以下几个部分:

  1. 导入 MySQLdb 模块和导入数据库连接参数。

    代码如下:

    import MySQLdb
    from config import OCEANBASE_CONFIG
  2. 定义创建表的函数。

    定义函数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)
  3. 定义插入数据的函数。

    定义函数insert_record,该函数主要实现了向指定表中插入一条记录,记录包含nameage两个字段。使用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)
    
  4. 定义查询表数据的函数。

    定义函数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 模块来操作数据库,并通过交互式命令行界面让您进行相应的操作。您可以通过该程序来创建表、插入记录和查询所有记录,从而实现了基本的数据库操作。

该文件中主要包括以下几个部分:

  1. 导入db.py文件中定义的函数。

    从 db 模块中导入create_tableinsert_recordselect_all这三个函数。

    代码如下:

    from db import create_table, insert_record, select_all
    
  2. 定义一个函数,用于操作数据库。

    定义函数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]")
  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()

相关文档