在 Python 中使用连接池提升性能

说实话,链接非常重要。
每次使用数据库时,都必须创建连接、创建对象、与数据库对话、验证等,这需要花费大量时间。
使用链接池意味着提前建立一组链接,使用时取出,用完后放回。
这样就不需要重复建设和破坏,效率非常高。

对于像SQLite这样的轻量级数据库,虽然建立连接没有那么难,但是如果并发量又高又快的话,还是需要优化。
Python自带了sqlite3 ,但是没有连接池功能。
自己写也可以,但是比较费力。
使用像 sqlalchemy 这样的第三方库要简单得多,只需 pip install sqlalchemy 即可。

如果你自己写,比如SQLite,你可以这样做:
python 导入sqlite3 从队列导入 Queue
类 SQLiteConnectionPool: def __start__(self, db_path, max_connections=1 0): self.db_path = db_path self.max_connections = 最大连接数 self.free_connections = 队列(maxsize=max_connections) def get_connection(自身): 如果 self.free_connections.empty(): conn = sqlite3 .connect(self.db_path) 其他: conn = self.free_connections.get() 返回链接 def put_connection(自身, 连接): self.free_connections.put(conn)
该类负责管理连接。
初始化时指定数据库文件和最大连接数,并使用队列来存储空闲连接。
当要连接时,首先检查队列是否为空。
如果为空,则创建一个新的。
如果不为空,则提取一个。
使用完后将其放回原处即可。

更容易使用 sqlalchemy:
python from import sqlalchemy create_engine
engine = create_engine('sqlite:///my_database.db', pool_size=1 0)
然后使用数据库:
python 来自导入文本 sqlalchemy
,其中 engine.connect() 作为 conn: 结果 = conn.execute(text("从响应中选择")) 对于结果中的行: 打印(行)
with 语句会自动将连接放回池中。
这样就无需手动关闭。

对于更高级的方面,sqlalchemy还支持事务管理、ORM模型等,可以帮助你更好地管理数据库操作。

总之,使用连接池可以省事、提高性能。
尤其是在Web应用中,可以大大提高效率。
建议自己尝试一下,感受一下效果。

Python中sqlite3模块 SQLite数据库操作模块sqlite3的CRUD指南

SQLite3 ...相当方便。
我之前做过一个项目……2 02 2 年,我用它来做本地存储。
它重量轻,可用于存放小物品。

首先连接数据库。
使用 sqlite3 .connect('example.db') 进行连接。
如果您没有此文件,系统会为您创建该文件。
好的?然后创建一个游标,(cursor=conn.cursor()),这样方便操作。

然后创建表。
创建表时,使用 CREATE TABLE IF NOT EXISTS 来防止重复创建。
我将在此处创建一个用户表,其中包含字段 id、姓名和年龄。
ID设置为autoincrement,即自动递增。
像这样:
Python 光标.执行("" 如果用户不存在则创建表( id 整数主键自增, 名称文本不为零, 年龄整数 ) ''') 不要忘记提交conn.commit(),否则就没用
提交交易。
(conn.commit()) 这一步非常重要。

下一步是插入数据。
要插入单行,请使用 INSERT INTO,后跟 VALUES。
注意?防止 SQL 注入的占位符。
像这样:
Python cursor.execute("插入用户(姓名,年龄)值(?, ?)", ("张三", 2 5 )) conn.commit()
批量插入效率更高。
使用executeMany()。
像这样:
Python data = [("李四", 3 0), ("王五", 2 8 )] 光标.executemany(“插入用户(姓名,年龄)值(?,?)”,数据) conn.commit()
然后检查数据。
要检查全部,请使用 select from users。
然后使用 fetchChall() 获取所有结果,或使用 fetchOn() 获取一个结果。
这类型:
Python cursor.execute('从用户中选择') rows =cursor.fetchall() rows 是包含元组的列表 对于行中的行: print(row) 每行数据都是一个元组
要检查特定内容,请添加 WHERE 条件。
参数以元组形式传递。
像这样:
Python cursor.execute('从年龄 > ? 的用户中选择', (2 5 ,)) result =cursor.fetchone() 只会获取一个
要更新数据,请使用 UPDATE 语句。
必须添加WHERE,否则整个表都会被更新,这将是一场灾难。
像这样:
Python cursor.execute("UPDATE USERS SET AGE=? WHERE NAME=?", (2 6 , "张三")) conn.commit()
使用DELETE语句删除数据。
和上面类似,WHERE不能少。
在继续之前最好检查一下需要删除哪些内容。
像这样:
Python cursor.execute("删除年龄 < ? 的用户", (1 8 ,)) conn.commit()
操作完成后,游标和连接应关闭。
不然资源泄漏就不好了。
像这样:
Python 光标.close() conn.close()
还有一点值得注意。
例如,SQL语法、SQLite、MySQL和PostgreSQL并不完全相同。
数据类型也有限制。
SQLite 仅有的类型有:NULL、INTEGER、REAL、TEXT 和 BLOB。
设计桌子时你必须考虑清楚。

使用try-except来捕获异常也不错。
就像 sqlite3 .Error 一样。
否则会报错,直接崩溃,不太优雅。

此外,在批处理操作期间使用executeMany(),这可以减少交互并使其更快。
不要一直打开和关闭连接。
如果可以的话,使用一个。
您还可以使用 BEGIN 或设置isolation_level=None 自行管理事务。

这就是我所做的一切。
SQLite3 适合小型项目或临时本地数据存储。
好吧,就是这样。