python操作mariadb应优先选择pymysql或mysql-connector-python,pymysql因纯python实现、安装简便、社区活跃而更适合大多数场景;2. 防止sql注入必须使用参数化查询,通过占位符(如%s)与参数元组分离sql结构与数据,避免恶意输入篡改语句;3. 事务处理需手动控制,通过conn.autocommit=false禁用自动提交,在try块中执行操作,成功则conn.commit()提交,异常则conn.rollback()回滚,确保数据一致性;4. 使用dictcursor可使查询结果以字典形式返回,提升数据处理便利性;5. 实际操作流程包括安装库、连接数据库、创建游标、执行sql、处理结果及关闭资源,全程需用try-except-finally确保连接正确释放。

Python操作MariaDB数据库,核心在于使用合适的数据库连接器(或者说驱动)。这些连接器提供了标准化的API,让你能够像与任何其他数据库交互一样,建立连接、执行SQL查询、处理结果集,并管理事务。最常用的纯Python连接器是
PyMySQL
mysql-connector-python
要用Python来操作MariaDB,我们通常会遵循一套比较标准的流程,这包括安装连接库、建立连接、创建游标、执行SQL命令、处理结果,最后关闭连接。这听起来可能有点流程化,但实际操作起来,你会发现它非常直观。
首先,你需要安装一个数据库连接库。我个人比较常用
PyMySQL
立即学习“Python免费学习笔记(深入)”;
pip install PyMySQL
安装好之后,就可以开始编写代码了。连接数据库是第一步,你需要提供数据库的主机地址、用户名、密码和数据库名。字符集也很重要,避免出现乱码问题,通常设置为
utf8mb4
import pymysql
# 数据库连接参数
DB_CONFIG = {
'host': 'localhost', # 或者你的MariaDB服务器IP/域名
'user': 'your_username',
'password': 'your_password',
'database': 'your_database_name',
'charset': 'utf8mb4',
'cursorclass': pymysql.cursors.DictCursor # 可以选择返回字典形式的结果
}
conn = None # 初始化连接变量
cursor = None # 初始化游标变量
try:
# 建立数据库连接
conn = pymysql.connect(**DB_CONFIG)
# 创建游标对象,用于执行SQL命令
# 如果不设置cursorclass,默认返回元组形式的结果
cursor = conn.cursor()
# --- 执行查询操作 ---
sql_select = "SELECT id, name, age FROM users WHERE age > %s"
cursor.execute(sql_select, (25,)) # 注意这里的参数化查询,非常重要!
# 获取所有查询结果
users = cursor.fetchall()
print("查询结果:")
for user in users:
print(user)
# --- 执行插入操作 ---
# 插入数据时,也强烈建议使用参数化查询
sql_insert = "INSERT INTO users (name, age) VALUES (%s, %s)"
new_user_data = ("Alice", 30)
cursor.execute(sql_insert, new_user_data)
conn.commit() # 提交事务,让修改生效
print(f"\n插入了新用户: {new_user_data[0]}, ID: {cursor.lastrowid}")
# --- 执行更新操作 ---
sql_update = "UPDATE users SET age = %s WHERE name = %s"
cursor.execute(sql_update, (31, "Alice"))
conn.commit()
print(f"\n更新了 {cursor.rowcount} 条记录。")
# --- 执行删除操作 ---
sql_delete = "DELETE FROM users WHERE name = %s"
cursor.execute(sql_delete, ("Bob",))
conn.commit()
print(f"\n删除了 {cursor.rowcount} 条记录。")
except pymysql.Error as e:
print(f"数据库操作失败: {e}")
if conn:
conn.rollback() # 发生错误时回滚事务
finally:
# 无论成功失败,确保关闭游标和连接
if cursor:
cursor.close()
if conn:
conn.close()
print("\n数据库连接已关闭。")
这段代码涵盖了连接、查询、插入、更新和删除这些基本操作。特别要注意的是,我在这里使用了
cursorclass=pymysql.cursors.DictCursor
选择Python连接MariaDB的连接器,这其实是个挺实际的问题。市面上主要的选项有
PyMySQL
mysql-connector-python
PyMySQL
pip install PyMySQL
PyMySQL
而
mysql-connector-python
PyMySQL
除了这两个直接的连接器,我们还会提到
SQLAlchemy
SQLAlchemy
PyMySQL
mysql-connector-python
SQLAlchemy
PyMySQL
SQL注入,这个词听起来就让人头皮发麻,它是数据库安全领域一个非常经典的漏洞。简单来说,就是恶意用户通过在输入框中注入SQL代码,来改变你预期的SQL查询,从而达到非法访问、修改甚至删除数据的目的。幸好,在Python操作MariaDB时,防止SQL注入有一个非常成熟且简单有效的方法:使用参数化查询(Parameterized Queries)。
参数化查询的核心思想是,将SQL语句的结构和要传入的数据完全分开。你在编写SQL语句时,用占位符(比如
%s
execute()
PyMySQL
我们来看个例子。假设你有一个用户登录功能,如果直接拼接字符串:
# 错误示范!极易导致SQL注入!
username = input("请输入用户名: ")
password = input("请输入密码: ")
sql = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
cursor.execute(sql)如果用户输入
username = 'admin' OR '1'='1' --
SELECT * FROM users WHERE username = 'admin' OR '1'='1' --' AND password = '...'
后面的
--
正确的做法是使用参数化查询:
# 正确示范!使用参数化查询防止SQL注入
username = input("请输入用户名: ")
password = input("请输入密码: ")
sql = "SELECT * FROM users WHERE username = %s AND password = %s"
cursor.execute(sql, (username, password)) # 将参数作为元组传递在这种情况下,无论用户输入什么,
PyMySQL
\'
除了参数化查询,还有一些辅助性的安全措施也值得考虑:
记住,参数化查询是防止SQL注入的基石,务必在所有涉及用户输入或外部数据的SQL操作中坚持使用它。
在数据库操作中,事务(Transaction)是一个非常重要的概念,尤其是在你需要执行一系列相互关联的数据库操作时。简单来说,事务就是一组操作,它们要么全部成功提交(commit),要么全部失败回滚(rollback)。这保证了数据的一致性和完整性,避免了数据处于中间状态的混乱。想象一下银行转账,从A账户扣钱和B账户加钱必须同时成功或同时失败,不能只成功一个。
MariaDB(以及MySQL)默认情况下,每个独立的SQL语句都是一个隐式的事务,会自动提交。但在Python中,当我们通过
PyMySQL
处理事务的基本流程是:
autocommit
False
connection.commit()
connection.rollback()
我们来看一个模拟银行转账的例子,它很好地展示了事务的用法:
import pymysql
DB_CONFIG = {
'host': 'localhost',
'user': 'your_username',
'password': 'your_password',
'database': 'your_database_name',
'charset': 'utf8mb4',
'cursorclass': pymysql.cursors.DictCursor
}
conn = None
cursor = None
try:
conn = pymysql.connect(**DB_CONFIG)
# 禁用自动提交,手动控制事务
conn.autocommit = False
cursor = conn.cursor()
from_account_id = 101
to_account_id = 102
amount_to_transfer = 50.0
print(f"尝试从账户 {from_account_id} 转账 {amount_to_transfer} 到账户 {to_account_id}...")
# 1. 检查转出账户余额
cursor.execute("SELECT balance FROM accounts WHERE id = %s FOR UPDATE", (from_account_id,))
from_balance = cursor.fetchone()
if not from_balance or from_balance['balance'] < amount_to_transfer:
raise ValueError("转出账户余额不足或账户不存在!")
# 2. 从转出账户扣款
sql_deduct = "UPDATE accounts SET balance = balance - %s WHERE id = %s"
cursor.execute(sql_deduct, (amount_to_transfer, from_account_id))
print(f"已从账户 {from_account_id} 扣除 {amount_to_transfer}。")
# 3. 向转入账户加款
sql_add = "UPDATE accounts SET balance = balance + %s WHERE id = %s"
cursor.execute(sql_add, (amount_to_transfer, to_account_id))
print(f"已向账户 {to_account_id} 增加 {amount_to_transfer}。")
# 如果所有操作都成功,提交事务
conn.commit()
print("\n转账成功!所有操作已提交。")
except pymysql.Error as e:
print(f"\n数据库操作失败: {e}")
if conn:
conn.rollback() # 发生任何错误,回滚所有操作
print("事务已回滚。")
except ValueError as ve:
print(f"\n业务逻辑错误: {ve}")
if conn:
conn.rollback() # 业务逻辑错误也回滚
print("事务已回滚。")
finally:
if cursor:
cursor.close()
if conn:
conn.close()
print("数据库连接已关闭。")在这个例子中,
FOR UPDATE
except
conn.rollback()
使用事务时,有几个小点需要注意:
commit()
commit()
try...except...finally
理解并熟练运用事务,是编写健壮、可靠的数据库应用的关键。
以上就是Python怎样操作MariaDB数据库?mariadb连接器的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号