python使用mysql

 

 

 

python安装mysql官方驱动:

python -m pip install mysql-connector

 

由于我安装的是mysql8.0,在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则为caching_sha2_password。



ALTER
USER admin@'%' IDENTIFIED WITH mysql_native_password BY 'admin'

 

 

import mysql.connector

mydb = mysql.connector.connect(
    host="127.0.0.1",
    user="admin",
    passwd="admin",
    database="apple",
    auth_plugin='mysql_native_password'
)
mycursor = mydb.cursor()

mycursor.execute("SHOW TABLES")

 ######################

在多线程环境下,对于 MySQL Connector/Python 的连接池进行操作,需要保证线程安全。可以通过加锁的方式来实现线程安全,可以使用 Python 中的 threading.Lock() 对连接池进行加锁。

下面是一个基于 MySQL Connector/Python 的连接池,可以供不同文件安全地调用的示例:

import mysql.connector.pooling
import threading

class ConnectionPool:
    def __init__(self, pool_size, **kwargs):
        # 创建连接池
        self.config = kwargs
        self.pool = mysql.connector.pooling.MySQLConnectionPool(pool_size=pool_size, **kwargs)
        self.lock = threading.Lock()

    def get_connection(self):
        # 获取连接
        try:
            cnx = self.pool.get_connection()
        except mysql.connector.Error as e:
            print("Error: {}".format(str(e)))
            cnx = None

        return cnx

    def return_connection(self, cnx):
        # 归还连接
        self.lock.acquire()
        try:
            self.pool.add_connection(cnx)
        except mysql.connector.Error as e:
            print("Error: {}".format(str(e)))
        finally:
            self.lock.release()

# 创建连接池对象
pool = ConnectionPool(pool_size=5, host="localhost", user="root", password="password", database="test")

# 定义一个查询函数
def query_database():
    try:
        # 获取连接
        cnx = pool.get_connection()

        # 执行 SQL 查询语句
        cursor = cnx.cursor()
        query = ("SELECT name, age FROM mytable")
        cursor.execute(query)

        # 获取查询结果
        for (name, age) in cursor:
            print("{} is {} years old".format(name, age))

        # 关闭游标和数据库连接
        cursor.close()
        pool.return_connection(cnx)
    except Exception as e:
        print("Error: {}".format(str(e)))
        if cnx:
            cnx.close()

# 在不同的文件中调用连接池接口
if __name__ == "__main__":
    # 启动多个线程执行查询操作
    threads = []
    for i in range(10):
        t = threading.Thread(target=query_database)
        t.start()
        threads.append(t)

    # 等待所有线程结束
    for t in threads:
        t.join()

在上述示例代码中,我们定义了一个 ConnectionPool 类来封装 MySQL Connector/Python 的连接池操作。在类的构造函数中,创建连接池对象,并初始化锁对象。类中还定义了 get_connection()return_connection() 方法,用于从连接池中获取连接和归还连接。

在查询函数 query_database() 中,我们先从连接池中获取连接,然后执行 SQL 查询语句,最后再将连接归还到连接池中。在主程序中,我们创建了一个连接池对象,并在不同的文件中调用连接池接口来执行查询操作。

这样,就可以安全地在多线程环境下使用 MySQL Connector/Python 的连接池了。注意,对于不同的应用场景,需要根据具体情况来调整连接池的大小,以充分利用系统资源。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

##########################

posted @ 2020-10-13 14:53  igoodful  阅读(154)  评论(0编辑  收藏  举报