0


Python MySQL - mysql-connector 驱动

1. 请解释Python中的MySQL连接池是什么,以及它的作用和优点。

在Python中,MySQL连接池是一种管理数据库连接的技术。它的作用是预先创建一定数量的数据库连接,并将其保存在一个连接池中,以便在需要时可以快速获取可用的连接,避免了频繁地创建和销毁连接所带来的性能开销。

MySQL连接池的优点包括:

  1. 提高性能:通过复用已建立的数据库连接,减少了创建和关闭连接的时间消耗,提高了应用程序的性能。
  2. 节约资源:预先创建一定数量的连接并保持它们处于打开状态,避免了频繁地创建和关闭连接所需的系统资源消耗。
  3. 支持并发访问:连接池中的多个连接可以同时被多个线程或进程使用,提高了并发访问数据库的能力。
  4. 管理连接生命周期:连接池可以对连接进行有效管理,包括监控空闲连接的数量、超时处理等,确保连接的有效性和稳定性。
  5. 可配置性:连接池的大小、超时时间等参数可以根据实际需求进行调整,提供了更好的灵活性和可配置性。

总之,MySQL连接池可以提高应用程序的性能和稳定性,减少资源消耗,并支持并发访问数据库。它是在Python中使用MySQL数据库时常用的一种优化技术。

2. 如何使用mysql-connector驱动在Python中执行SQL查询?

在Python中,可以使用mysql-connector驱动来执行SQL查询。以下是一个简单的示例代码:

import mysql.connector

# 建立数据库连接
mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="yourdatabase")# 创建游标对象
mycursor = mydb.cursor()# 执行SQL查询语句
mycursor.execute("SELECT * FROM yourtable")# 获取所有结果
myresult = mycursor.fetchall()# 打印结果for x in myresult:print(x)

在上面的代码中,首先使用

mysql.connector.connect()

方法建立与MySQL数据库的连接。然后,创建一个游标对象

mycursor

,用于执行SQL查询语句。接下来,使用

mycursor.execute()

方法执行SQL查询语句。在本例中,我们选择了从名为

yourtable

的表中选择所有记录。最后,使用

mycursor.fetchall()

方法获取所有结果,并使用循环打印每个结果。

3. 如何在Python中使用mysql-connector驱动执行参数化查询,以防止SQL注入攻击?

在Python中,我们可以使用mysql-connector驱动来执行参数化查询,以防止SQL注入攻击。参数化查询是一种安全的方法,它允许我们将数据作为参数传递给查询,而不是直接将它们插入到查询字符串中。这样,即使用户输入包含恶意代码的数据,也可以确保这些数据不会被解析为SQL代码并执行。

以下是如何在Python中使用mysql-connector驱动执行参数化查询的示例:

  1. 首先,确保已经安装了mysql-connector-python库。如果没有安装,可以使用以下命令安装:
pip install mysql-connector-python
  1. 然后,编写一个使用参数化查询的Python程序:
import mysql.connector

# 连接到MySQL数据库
cnx = mysql.connector.connect(user='your_username', password='your_password', host='your_host', database='your_database')
cursor = cnx.cursor()# 定义一个包含用户输入的变量
user_input =input("请输入您的名字:")# 使用参数化查询,将用户输入作为参数传递给查询
query ="SELECT * FROM users WHERE name = %s"
cursor.execute(query,(user_input,))# 获取查询结果并打印
results = cursor.fetchall()for row in results:print(row)# 关闭游标和连接
cursor.close()
cnx.close()

在这个示例中,我们首先导入了

mysql.connector

模块,然后使用

connect()

函数连接到MySQL数据库。接下来,我们定义了一个包含用户输入的变量

user_input

,并使用参数化查询将其作为参数传递给查询。注意,我们在查询字符串中的占位符

%s

后面添加了一个元组

(user_input,)

,其中包含了要传递的参数。最后,我们使用

cursor.execute()

函数执行查询,并使用

cursor.fetchall()

获取查询结果。

4. 请解释Python中的游标对象,以及它在处理大型数据集时的作用。

在Python编程语言中,游标对象主要是用于执行与MySQL数据库通信的语句。更具体来说,游标是一个数据库查询的结果集,它可以用来按照行读取数据。当处理大型数据集时,使用游标对象特别有帮助,因为此时可能无法一次性将所有数据全部加载到内存中。这时可以使用游标来逐行读取数据,既可以提高程序的运行效率,又可以有效地管理内存资源。

在Python的mysql-connector库中,可以通过Connection对象的cursor()方法创建一个游标对象。这个游标对象可以用来执行SQL语句以及从结果集中获取数据。需要注意的是,Connection对象并不包含任何属性,但是提供了一些方法,例如close()用于关闭数据库连接,commit()和rollback()分别用于提交和取消当前事务等。

以下是一个示例代码,演示了如何在Python中使用mysql-connector库连接到MySQL数据库并创建一个游标对象:

import mysql.connector

# 连接到MySQL数据库
db = mysql.connector.connect(
    host="localhost",
    user="yourusername",
    password="yourpassword",
    database="yourdatabase")# 创建游标对象
cursor = db.cursor()

5. 如何使用mysql-connector驱动在Python中执行事务操作?

在Python中,可以使用mysql-connector驱动来执行事务操作。以下是一个简单的示例:

import mysql.connector

# 创建数据库连接
cnx = mysql.connector.connect(user='username', password='password', host='localhost', database='testdb')# 创建一个游标对象
cursor = cnx.cursor()try:# 开始一个事务
    cnx.start_transaction()# 执行一些SQL语句
    cursor.execute("INSERT INTO customers (first_name, last_name) VALUES ('John', 'Doe')")
    cursor.execute("UPDATE customers SET last_name='Smith' WHERE first_name='John'")# 提交事务
    cnx.commit()except mysql.connector.Error as err:print("发生错误: {}".format(err))# 如果发生错误,回滚事务
    cnx.rollback()finally:# 关闭游标和连接
    cursor.close()
    cnx.close()

在这个例子中,我们首先创建了一个数据库连接和一个游标对象。然后,我们使用

start_transaction()

方法开始一个新的事务。在事务中,我们执行了一些SQL语句。如果所有SQL语句都成功执行,我们就调用

commit()

方法提交事务。如果在执行SQL语句时发生错误,我们就捕获异常,并调用

rollback()

方法回滚事务,以保持数据库的一致性。最后,无论是否发生错误,我们都关闭了游标和连接。

6. 请解释Python中的异常处理机制,以及如何在使用mysql-connector驱动时处理数据库连接异常。

在Python中,异常处理是一种机制,用于捕获和处理程序运行过程中可能出现的错误或异常。当Python遇到一个错误时,它会停止当前的程序执行并生成一个异常对象。如果异常没有被处理(或者捕获),那么程序就会立即终止并显示一个错误消息。

Python使用try/except语句来创建异常处理块。在try块中,我们编写可能会抛出异常的代码;在except块中,我们编写处理异常的代码。如果在try块中的代码抛出了在except后面指定的异常类型,那么except块中的代码就会被执行。

在使用mysql-connector驱动时,我们可能会遇到各种数据库连接相关的异常,例如:

mysql.connector.Error

mysql.connector.InterfaceError

等。为了处理这些异常,我们可以在try/except语句中捕获这些特定的异常类型。

以下是一个示例代码,演示了如何在Python中使用mysql-connector驱动连接到MySQL数据库,并处理可能出现的数据库连接异常:

import mysql.connector
from mysql.connector import Error

try:# 创建数据库连接
    cnx = mysql.connector.connect(user='username', password='password', host='localhost', database='testdb')# 创建一个游标对象
    cursor = cnx.cursor()# 执行一些SQL语句...except Error as e:print("发生错误: {}".format(e))finally:if(cnx.is_connected()):
        cursor.close()
        cnx.close()print("MySQL连接已关闭")

在这个例子中,我们在try块中创建了一个数据库连接和一个游标对象。如果在创建连接或执行SQL语句时出现任何错误,我们就会在except块中捕获到这个错误,并打印出错误信息。无论是否出现错误,我们都会在finally块中关闭游标和连接。

7. 如何使用mysql-connector驱动在Python中实现数据库连接池?

在Python中,可以使用

mysql-connector

驱动来实现数据库连接池。以下是一个示例代码:

import mysql.connector
from mysql.connector import pooling

# 创建连接池
config ={'user':'yourusername','password':'yourpassword','host':'localhost','database':'yourdatabase','pool_size':10,# 连接池大小'max_overflow':2,# 最大溢出连接数'autocommit':True,'charset':'utf8mb4'}

cnxpool = mysql.connector.pooling.MySQLConnectionPool(pool_name="mypool",**config)# 从连接池中获取连接defget_connection():return cnxpool.get_connection()# 使用连接执行查询操作defexecute_query(query):
    conn = get_connection()
    cursor = conn.cursor()
    cursor.execute(query)
    result = cursor.fetchall()
    cursor.close()
    conn.close()return result

# 示例查询操作
query ="SELECT * FROM yourtable"
result = execute_query(query)print(result)

在上面的代码中,首先定义了一个配置字典

config

,其中包含了数据库连接的相关参数,如用户名、密码、主机名、数据库名等。然后,使用

mysql.connector.pooling.MySQLConnectionPool

创建一个名为

mypool

的连接池,并将配置字典作为参数传递给它。可以根据实际需求调整连接池的大小和最大溢出连接数等参数。

接下来,定义了两个函数:

get_connection()

用于从连接池中获取一个可用的连接,

execute_query(query)

用于执行查询操作并返回结果。在

execute_query()

函数中,首先通过调用

get_connection()

函数获取一个连接对象,然后创建一个游标对象,并执行查询语句。最后,关闭游标和连接对象,并返回查询结果。

最后,演示了如何使用

execute_query()

函数执行一个简单的查询操作,并打印结果。在实际使用中,可以根据需要执行不同的查询操作。

8. 请解释Python中的批量操作,以及如何在使用mysql-connector驱动时实现批量插入、更新和删除操作。

批量操作是指在一次数据库交互中执行多个SQL语句。相比于分别执行每个SQL语句,批量操作可以显著提高程序的运行效率,因为减少了网络往返的次数。

在Python中,可以使用mysql-connector驱动来执行批量插入、更新和删除操作。以下是一个示例代码,演示了如何在Python中使用mysql-connector驱动进行批量插入操作:

import mysql.connector

cnx = mysql.connector.connect(user='username', password='password', host='localhost', database='testdb')
cursor = cnx.cursor()# 定义要插入的数据
data =[('John','Doe'),('Jane','Doe'),('Jim','Smith')]# 使用executemany方法执行批量插入操作
sql ="INSERT INTO customers (first_name, last_name) VALUES (%s, %s)"
cursor.executemany(sql, data)# 提交事务
cnx.commit()# 关闭游标和连接
cursor.close()
cnx.close()

在这个例子中,我们首先创建了一个数据库连接和一个游标对象。然后,我们定义了一些要插入的数据,并使用

executemany

方法执行批量插入操作。这个方法接受一个SQL语句和一个元组列表作为参数,其中元组列表中的每个元组对应于一个要插入的行。最后,我们提交了事务,并关闭了游标和连接。

类似的,我们也可以使用

executemany

方法来执行批量更新和删除操作。

9. 如何使用mysql-connector驱动在Python中实现存储过程和函数的调用?

在Python中,可以使用

mysql-connector

驱动来调用存储过程和函数。以下是一个示例代码:

import mysql.connector
from mysql.connector import pooling

# 创建连接池
config ={'user':'yourusername','password':'yourpassword','host':'localhost','database':'yourdatabase','pool_size':10,# 连接池大小'max_overflow':2,# 最大溢出连接数'autocommit':True,'charset':'utf8mb4'}

cnxpool = mysql.connector.pooling.MySQLConnectionPool(pool_name="mypool",**config)# 从连接池中获取连接defget_connection():return cnxpool.get_connection()# 调用存储过程defcall_stored_procedure(procedure_name, parameters):
    conn = get_connection()
    cursor = conn.cursor()
    cursor.callproc(procedure_name, parameters)
    result = cursor.fetchall()
    cursor.close()
    conn.close()return result

# 调用函数defcall_function(function_name, parameters):
    conn = get_connection()
    cursor = conn.cursor()
    cursor.callproc(function_name, parameters)
    result = cursor.fetchone()
    cursor.close()
    conn.close()return result[0]# 示例存储过程调用
procedure_name ="your_stored_procedure"
parameters =(1,"parameter1","parameter2")
result = call_stored_procedure(procedure_name, parameters)print(result)# 示例函数调用
function_name ="your_function"
parameters =(1,"parameter1","parameter2")
result = call_function(function_name, parameters)print(result)

在上面的代码中,首先定义了一个配置字典

config

,其中包含了数据库连接的相关参数。然后,使用

mysql.connector.pooling.MySQLConnectionPool

创建一个名为

mypool

的连接池,并将配置字典作为参数传递给它。可以根据实际需求调整连接池的大小和最大溢出连接数等参数。

接下来,定义了两个函数:

call_stored_procedure()

用于调用存储过程,

call_function()

用于调用函数。这两个函数都接受一个存储过程或函数的名称以及相应的参数列表。在函数内部,通过调用

cursor.callproc()

方法来执行存储过程或函数,并使用

cursor.fetchall()

cursor.fetchone()

方法来获取结果。最后,关闭游标和连接对象,并返回结果。

最后,演示了如何使用

call_stored_procedure()

call_function()

函数分别调用存储过程和函数,并打印结果。在实际使用中,可以根据需要执行不同的存储过程和函数调用。

10. 请解释Python中的连接超时和查询超时,以及如何在使用mysql-connector驱动时设置这些超时时间。

在Python编程中,连接超时是指在尝试与数据库建立连接时,等待服务器响应的最长时间。如果在规定的时间内服务器未能响应,那么将会抛出一个超时异常。另一方面,查询超时是指在执行SQL语句时,等待服务器处理的最长时间。如果在这个时间内服务器未能完成对SQL语句的处理,那么将会抛出一个超时异常。

在使用mysql-connector驱动来连接MySQL数据库时,可以通过设置connection_timeout参数来调整连接超时时间。示例代码如下:

import mysql.connector

cnx = mysql.connector.connect(user='username', password='password', host='localhost', database='testdb', connection_timeout=10)
cursor = cnx.cursor()# 执行一些SQL语句...

在上述代码中,我们将连接超时时间设置为10秒。这意味着如果服务器在10秒内未能响应我们的连接请求,那么将抛出一个超时异常。需要注意的是,对于查询超时的设置,mysql-connector驱动目前并不直接支持。如果遇到查询超时问题,可能需要通过优化SQL语句或调整数据库配置来解决。

11. 如何使用mysql-connector驱动在Python中实现分页查询?

在Python中,可以使用

mysql-connector

驱动来实现分页查询。以下是一个示例代码:

import mysql.connector
from mysql.connector import pooling

# 创建连接池
config ={'user':'yourusername','password':'yourpassword','host':'localhost','database':'yourdatabase','pool_size':10,# 连接池大小'max_overflow':2,# 最大溢出连接数'autocommit':True,'charset':'utf8mb4'}

cnxpool = mysql.connector.pooling.MySQLConnectionPool(pool_name="mypool",**config)# 从连接池中获取连接defget_connection():return cnxpool.get_connection()# 实现分页查询defpaginate_query(table_name, page_number, page_size):
    offset =(page_number -1)* page_size
    query =f"SELECT * FROM {table_name} LIMIT {offset}, {page_size}"
    conn = get_connection()
    cursor = conn.cursor()
    cursor.execute(query)
    results = cursor.fetchall()
    cursor.close()
    conn.close()return results

# 示例分页查询
table_name ="your_table"
page_number =2
page_size =10
results = paginate_query(table_name, page_number, page_size)print(results)

在上面的代码中,首先定义了一个配置字典

config

,其中包含了数据库连接的相关参数。然后,使用

mysql.connector.pooling.MySQLConnectionPool

创建一个名为

mypool

的连接池,并将配置字典作为参数传递给它。可以根据实际需求调整连接池的大小和最大溢出连接数等参数。

接下来,定义了一个函数

paginate_query()

,用于实现分页查询。该函数接受三个参数:表名、页码和每页大小。通过计算偏移量(

offset

),构造SQL查询语句,并使用

cursor.execute()

方法执行查询。最后,使用

cursor.fetchall()

方法获取查询结果,并关闭游标和连接对象。

最后,演示了如何使用

paginate_query()

函数进行分页查询,并打印结果。在实际使用中,可以根据需要执行不同的分页查询。

12. 请解释Python中的主从复制,以及如何在使用mysql-connector驱动时实现主从复制。

主从复制是一种在数据库中复制和同步数据的方法,其中一个数据库(称为主数据库)的数据被复制到一个或多个其他数据库(称为从数据库)。主数据库处理所有的写操作,而从数据库则复制主数据库的数据以进行读取操作。

在Python中,可以使用mysql-connector驱动来实现主从复制。以下是一个示例代码,演示了如何在Python中使用mysql-connector驱动设置主从复制:

import mysql.connector

# 创建连接到主数据库的连接
cnx_master = mysql.connector.connect(user='username', password='password', host='localhost', database='testdb')
cursor_master = cnx_master.cursor()# 创建连接到从数据库的连接
cnx_slave = mysql.connector.connect(user='username', password='password', host='localhost', database='testdb_slave')
cursor_slave = cnx_slave.cursor()# 在主数据库上执行START SLAVE语句来启动主从复制
cursor_master.execute("START SLAVE")# 在从数据库上执行STOP SLAVE语句来停止主从复制
cursor_slave.execute("STOP SLAVE")

在这个例子中,我们首先创建了两个连接到不同数据库的连接对象。然后,我们在主数据库上执行了START SLAVE语句来启动主从复制。最后,我们在从数据库上执行了STOP SLAVE语句来停止主从复制。需要注意的是,这只是一个简单的示例,实际的主从复制配置可能会更复杂,包括指定主服务器的IP地址、端口号、日志文件的位置等。

13. 如何使用mysql-connector驱动在Python中实现数据库备份和恢复?

在Python中,可以使用

mysql-connector

驱动来实现数据库备份和恢复。以下是一个示例代码:

首先,确保已经安装了

mysql-connector

驱动,如果没有安装,可以使用以下命令进行安装:

pip install mysql-connector-python

然后,可以使用以下代码实现数据库备份和恢复:

import os
import mysql.connector
from mysql.connector import Error

defbackup_database(host, user, password, database):try:
        connection = mysql.connector.connect(host=host,
                                             user=user,
                                             password=password)if connection.is_connected():
            cursor = connection.cursor()
            backup_file =f"{database}_backup.sql"withopen(backup_file,'w')as f:
                cursor.execute(f"SHOW TABLES")
                tables = cursor.fetchall()for table in tables:
                    table_name = table[0]
                    cursor.execute(f"SELECT * FROM {table_name}")
                    rows = cursor.fetchall()for row in rows:
                        f.write(str(row)+ "
")print("Database backup completed successfully.")except Error as e:print(f"Error while connecting to MySQL: {e}")finally:if connection.is_connected():
            cursor.close()
            connection.close()print("MySQL connection is closed.")defrestore_database(host, user, password, database, backup_file):try:
        connection = mysql.connector.connect(host=host,
                                             user=user,
                                             password=password)if connection.is_connected():
            cursor = connection.cursor()withopen(backup_file,'r')as f:
                sql_commands = f.read().split(';')for command in sql_commands:if command.strip():
                        cursor.execute(command)
            connection.commit()print("Database restore completed successfully.")except Error as e:print(f"Error while connecting to MySQL: {e}")finally:if connection.is_connected():
            cursor.close()
            connection.close()print("MySQL connection is closed.")# 使用示例
host ="localhost"
user ="your_username"
password ="your_password"
database ="your_database"# 备份数据库
backup_database(host, user, password, database)# 恢复数据库
restore_database(host, user, password, database,"your_database_backup.sql")

在这个示例中,我们定义了两个函数

backup_database()

restore_database()

,分别用于备份和恢复数据库。这两个函数都接受四个参数:主机名、用户名、密码和数据库名。在备份函数中,我们首先连接到MySQL服务器,然后遍历数据库中的所有表,将每个表的数据写入到一个SQL文件中。在恢复函数中,我们首先连接到MySQL服务器,然后从指定的SQL文件中读取所有的SQL命令,并执行这些命令来恢复数据库。

14. 请解释Python中的数据库连接池调优,以及如何优化mysql-connector驱动的数据库连接池。

数据库连接池是预先创建一组数据库连接,并在需要时从池中获取连接。这种方式可以显著提高应用程序的性能,因为建立新的数据库连接是一个昂贵的操作。

在Python中,我们可以使用

mysql-connector

驱动来创建和管理MySQL数据库的连接池。以下是一些优化

mysql-connector

驱动的数据库连接池的方法:

  1. 最大连接数:这是连接池可以持有的最多连接数。如果设置得太高,可能会导致系统资源耗尽;如果设置得太低,可能会频繁地创建和销毁连接,导致性能下降。一般来说,这个值应该根据系统的并发需求和数据库服务器的能力来设置。
  2. 最小连接数:这是连接池在任何时候都必须保持的最少连接数。如果设置得太高,可能会导致不必要的资源浪费;如果设置得太低,可能会导致频繁地创建和销毁连接,导致性能下降。一般来说,这个值应该根据系统的并发需求来设置。
  3. 连接超时时间:这是等待获取连接的最长时间(以秒为单位)。如果设置得太短,可能会导致频繁地创建和销毁连接,导致性能下降;如果设置得太长,可能会导致请求被阻塞的时间过长。一般来说,这个值应该根据系统的并发需求和数据库服务器的能力来设置。
  4. 测试SQL语句:这是用于测试新连接是否有效的SQL语句。一般来说,我们可以选择一个简单的查询语句,例如"SELECT 1"。
  5. 清理空闲连接的间隔:这是连接池定期清理空闲连接的时间间隔(以秒为单位)。如果设置得太短,可能会导致频繁地创建和销毁连接,导致性能下降;如果设置得太长,可能会导致空闲连接占用过多的系统资源。一般来说,这个值应该根据系统的并发需求和数据库服务器的能力来设置。
  6. 验证连接的SQL语句:这是用于验证连接是否仍然有效的SQL语句。一般来说,我们可以选择一个简单的查询语句,例如"SELECT 1"。

以下是一个创建和使用

mysql-connector

驱动的数据库连接池的例子:

import mysql.connector
from mysql.connector import pooling

# 创建连接池
config ={'user':'username','password':'password','host':'127.0.0.1','database':'database_name','pool_size':10,# 最大连接数'mincached':2,# 最小连接数'maxcached':5,# 最大连接数'blocking':True,# 当所有连接都在使用时是否阻塞等待'max_usage':None,# 每个连接的最大生命周期(以秒为单位)'setsession':[('variable_name','value')],# 设置会话变量'ping':True,# 是否定期检查连接的有效性'pool_timeout':30,# 获取连接的最长时间(以秒为单位)'pool_recycle':3600,# 清理空闲连接的间隔(以秒为单位)}
cnxpool = mysql.connector.pooling.MySQLConnectionPool(pool_name="mypool", pool_reset_session=True,**config)# 从连接池中获取连接并执行查询
cnx = cnxpool.get_connection()
cursor = cnx.cursor()
query ="SELECT * FROM table_name"
cursor.execute(query)for row in cursor:print(row)
cursor.close()
cnxpool.put_connection(cnx)

15. 如何使用mysql-connector驱动在Python中实现性能监控和诊断?

在Python中,我们可以使用

mysql-connector

驱动来连接MySQL数据库,并使用其提供的方法来获取性能监控和诊断信息。以下是一些基本步骤:

  1. 首先,我们需要安装mysql-connector驱动。可以使用pip进行安装:
pip install mysql-connector-python
  1. 然后,我们可以使用以下代码来连接到MySQL数据库:
import mysql.connector

cnx = mysql.connector.connect(user='username', password='password',
                              host='127.0.0.1',
                              database='database_name')
  1. 一旦我们连接到数据库,我们可以使用cursor对象来执行SQL查询,并获取结果。例如:
cursor = cnx.cursor()

query =("SELECT * FROM table_name")

cursor.execute(query)for row in cursor:print(row)
  1. 为了获取性能监控和诊断信息,我们可以使用cursor对象的statement属性。这个属性返回一个字符串,表示最后一次执行的SQL语句。例如:
print(cursor.statement)
  1. 我们还可以获取cursor对象的rowcount属性,它表示最后执行的SQL语句影响的行数。例如:
print(cursor.rowcount)
  1. 最后,不要忘记在完成所有操作后关闭游标和连接:
cursor.close()
cnx.close()

以上就是如何使用

mysql-connector

驱动在Python中实现性能监控和诊断的基本步骤。

标签: python mysql adb

本文转载自: https://blog.csdn.net/weixin_41312759/article/details/133843828
版权归原作者 编织幻境的妖 所有, 如有侵权,请联系我们删除。

“Python MySQL - mysql-connector 驱动”的评论:

还没有评论