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 的连接池了。注意,对于不同的应用场景,需要根据具体情况来调整连接池的大小,以充分利用系统资源。
##########################
igoodful@qq.com