
Research
Security News
The Growing Risk of Malicious Browser Extensions
Socket researchers uncover how browser extensions in trusted stores are used to hijack sessions, redirect traffic, and manipulate user behavior.
A high-performance MySQL database helper with connection pooling and query caching; 支持连接池和查询缓存的高性能MySQL数据库操作工具
MySQLPulse
是基于 dbutils.pooled_db
实现的高性能 MySQL 操作工具,封装了数据库连接池、SQL 构建、缓存优化等功能,支持 6 大核心操作:
create
)insert
)select
,带 LRU 缓存)update
)delete
)sql
)typing
注解定义参数类型IN
/NULL
/自定义操作符)select
方法结果进行缓存(默认缓存 1024 条)pip install mysqlpulse
from MySQLPulse import MySQLPulse
db = MySQLPulse(
dbName="your_database", # 数据库名(必填,默认 "mydb")
host="127.0.0.1", # 数据库地址(默认 "localhost")
user="root", # 用户名(默认 "root")
password="your_password", # 密码(默认 "root")
charset="utf8mb4", # 字符集(默认 "utf8mb4",支持 emoji)
poolSize=10 # 连接池大小(默认 CPU 核心数 × 5)
)
默认使用 logging
输出 INFO 级日志,格式:
[HH:MM:SS] [INFO] 操作状态 | 详细信息
可通过修改 logging.basicConfig
自定义日志行为:
import logging
logging.basicConfig(
level=logging.DEBUG, # 调整日志级别
filename="db.log", # 日志写入文件
format="%(asctime)s - %(message)s"
)
create(tableName, columns)
)tableName
:表名(字符串)columns
:列定义字典(键=列名,值=SQL 数据类型,如 "id": "INT AUTO_INCREMENT PRIMARY KEY"
)# 创建用户表(含主键、唯一索引)
columns = {
"user_id": "BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT",
"username": "VARCHAR(50) UNIQUE NOT NULL", # 唯一约束
"email": "VARCHAR(100) NOT NULL",
"create_time": "DATETIME DEFAULT CURRENT_TIMESTAMP" # 默认值
}
success = db.create("users", columns)
# 输出:[HH:MM:SS] [INFO] 📝 ✅ 表创建成功: users
insert(tableName, data)
)tableName
:表名data
:键值对字典(键=列名,值=插入值,支持 None
)# 插入单条用户数据
data = {
"username": "alice",
"email": "alice@example.com",
"age": 30 # 允许数值类型
}
rows = db.insert("users", data)
# 输出:[HH:MM:SS] [INFO] ⚡ ✅ 执行成功 | 影响行数: 1
select(tableName, where=None, fields=None)
)tableName
:表名where
:条件字典(支持多种语法,见下方)fields
:查询字段列表(默认 *
,支持字段别名)条件类型 | 示例字典 | 生成 SQL |
---|---|---|
等值查询 | {"username": "alice"} | WHERE username = %s |
NULL 判断 | {"email": None} | WHERE email IS NULL |
范围查询 | {"age": (">", 25)} | WHERE age > %s |
IN 列表 | {"user_id": [1, 2, 3]} | WHERE user_id IN (%s, %s, %s) |
模糊查询 | {"username": ("LIKE", "%alice%")} | WHERE username LIKE %s |
多条件组合 | {"age": (">", 25), "status": 1} | WHERE age > %s AND status = %s |
# 查询年龄 20-30 岁且状态为启用的用户(带字段过滤)
where = {
"age": (">=", 20), # 大于等于 20
"age__lt": ( "<", 30), # 别名写法(避免键冲突,实际生成 "age < %s")
"status": 1 # 等值条件
}
fields = ["username", "email", "age"] # 只查询指定字段
users = db.select("users", where=where, fields=fields)
# 输出:[HH:MM:SS] [INFO] 🔍 ✅ 查询完成 | 结果数: 5
where
和 fields
进行哈希化缓存maxsize=1024
(可修改 _selectCached
装饰器参数)db._selectCached.cache_clear()
(谨慎使用)update(tableName, setData, where)
)tableName
:表名setData
:更新的键值对(格式同 insert
的 data
)where
:更新条件(格式同 select
的 where
,必须包含条件,避免全表更新)# 将用户名为 "alice" 的年龄加 1,并标记为已验证
set_data = {
"age": "age + 1", # 支持 SQL 表达式(直接写入,需注意安全)
"is_verified": 1 # 普通键值对
}
where = {
"username": "alice"
}
rows = db.update("users", set_data, where)
# 输出:[HH:MM:SS] [INFO] ⚡ ✅ 执行成功 | 影响行数: 1
where
条件,否则抛出异常(防止误操作)age + 1
)需手动拼接,建议使用参数化避免 SQL 注入delete(tableName, where=None)
)tableName
:表名where
:删除条件(格式同 select
的 where
,无默认条件时删除全表数据!)# 删除 90 天前的日志数据(使用日期函数)
where = {
"create_time": ("<", "2023-01-01 00:00:00")
}
rows = db.delete("logs", where)
# 输出:[HH:MM:SS] [INFO] ⚡ ✅ 执行成功 | 影响行数: 1000
# 危险操作:删除全表(必须显式传入 `where=None`)
rows = db.delete("users", where=None) # 慎用!
where
条件时会删除全表数据,调用前请确认!select
先验证条件正确性sql(sql, args=None)
)sql
:原生 SQL 语句(可包含 {table}
占位符,自动替换表名)args
:参数列表(防止 SQL 注入,使用 %s
占位)# 带表名占位符的 SQL
table = "users"
sql = "SELECT COUNT(*) AS total FROM {table} WHERE age > %s"
count = db.sql(sql, args=(25,)) # 自动替换 {table} 为 "users"
# 输出:[{"total": 15}]
# 执行带 JOIN 的复杂查询
sql = """
SELECT u.username, o.order_id
FROM users u
JOIN orders o ON u.user_id = o.user_id
WHERE o.create_time BETWEEN %s AND %s
"""
args = ("2023-01-01", "2023-12-31")
results = db.sql(sql, args)
SELECT
语句:返回字典列表(List[Dict]
)int
)mincached=2
:最小空闲连接数(启动时创建)maxconnections=poolSize
:最大连接数(默认 CPU 核心数 × 5)所有数据库操作错误(如连接失败、SQL 语法错误)均会抛出 MySQLdb.Error
异常,需在调用层捕获:
try:
db.insert("non_exist_table", {})
except Error as e:
print(f"数据库错误:{str(e)}")
# 处理重试或回滚逻辑
INSERT INTO ... VALUES (%s,%s), (%s,%s)
格式提升插入速度create
方法中定义索引(如 UNIQUE
, INDEX
)_selectCached(maxsize=2048)
缓存大小class MySQLHelper:
def __init__(self, dbName="mydb", host='localhost', user='root', password='root', charset='utf8mb4', poolSize=None):
"""初始化连接池,创建数据库(若不存在)"""
def create(self, tableName: str, columns: Dict[str, str]) -> bool:
"""创建表,返回是否成功"""
def insert(self, tableName: str, data: Dict) -> int:
"""插入单条数据,返回影响行数"""
def select(self, tableName: str, where: Dict = None, fields: List[str] = None) -> List[Dict]:
"""带缓存的条件查询,返回结果列表"""
def update(self, tableName: str, setData: Dict, where: Dict) -> int:
"""条件更新,返回影响行数"""
def delete(self, tableName: str, where: Dict = None) -> int:
"""条件删除,返回影响行数"""
def sql(self, sql: str, args: Tuple = None) -> Union[int, List[Dict]]:
"""执行原生 SQL,自动区分查询/非查询"""
insert_many
)begin/commit/rollback
)FAQs
A high-performance MySQL database helper with connection pooling and query caching; 支持连接池和查询缓存的高性能MySQL数据库操作工具
We found that mysqlpulse demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover how browser extensions in trusted stores are used to hijack sessions, redirect traffic, and manipulate user behavior.
Research
Security News
An in-depth analysis of credential stealers, crypto drainers, cryptojackers, and clipboard hijackers abusing open source package registries to compromise Web3 development environments.
Security News
pnpm 10.12.1 introduces a global virtual store for faster installs and new options for managing dependencies with version catalogs.