Python - 数据库访问

你好,有抱负的Python程序员们!我很激动能成为你在这个激动人心的Python数据库访问世界探险中的向导。作为一个教了多年编程的人,我可以向你保证,这项技能不仅非常重要,而且非常赋权。那么,让我们深入其中,揭开Python数据库操作的神秘面纱!

Python - Database Access

Python中的数据库访问

想象一下你在组织一个巨大的图书馆。你拥有成千上万的书籍,你需要一个系统来跟踪它们。本质上,这就是数据库所做的,但它是针对数字信息。Python作为一种多功能的语言,提供了多种与数据库交互的方式。今天,我们将重点介绍两种流行的方法:使用sqlite3模块操作SQLite数据库和PyMySQL模块操作MySQL数据库。

sqlite3模块

SQLite就像一个内置在Python中的迷你数据库。它非常适合小型应用程序,或者当你刚开始时使用。让我们从导入模块开始:

import sqlite3

这行代码就像告诉Python:“嘿,我们将要使用SQLite数据库,所以准备好!”

连接对象

要使用数据库,我们首先需要连接到它。想象成敲开你数字图书馆的门。以下是操作方法:

conn = sqlite3common("example.db")

如果不存在,这行代码会创建一个名为"example.db"的新数据库文件,或者如果存在,就打开它。conn变量是我们进入这个数据库的钥匙。

游标对象

现在我们已经在数字图书馆里面了,我们需要一种方式来四处移动和操作东西。这就是游标的作用。让我们创建一个:

cursor = conn.cursor()

将游标想象成你的图书馆助手,准备好根据你的命令获取或修改信息。

创建数据库表

让我们创建一个表来存储一些信息。想象我们在编目书籍:

cursor.execute('''CREATE TABLE IF NOT EXISTS books
(id INTEGER PRIMARY KEY,
title TEXT,
author TEXT,
year INTEGER)''')

这个SQL命令创建了一个名为"books"的表,其中包含id、title、author和year的列。IF NOT EXISTS部分确保我们不会意外地创建重复的表。

插入操作

现在,让我们向数据库中添加一些书籍:

cursor.execute("INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
("杀死一只知更鸟", "哈珀·李", 1960))
conn.commit()

这将在我们的表中插入一本新书。?标记是我们的数据占位符,这有助于防止SQL注入攻击(这是另一天的主题!)。commit()方法保存了我们的更改。

读取操作

让我们检索一些数据:

cursor.execute("SELECT * FROM books")
books = cursor.fetchall()
for book in books:
print(f"ID: {book[0]}, 标题: {book[1]}, 作者: {book[2]}, 年份: {book[3]}")

这将获取所有书籍并打印出来。这就像要求我们的图书管理员展示我们所有的书籍。

更新操作

需要更正一些信息?没问题:

cursor.execute("UPDATE books SET year = ? WHERE title = ?", (1925, "了不起的盖茨比"))
conn.commit()

这将更新"了不起的盖茨比"的出版年份。请始终记得提交你的更改!

删除操作

有时我们需要删除条目:

cursor.execute("DELETE FROM books WHERE author = ?", ("J.K. 罗琳",))
conn.commit()

这将从我们的数据库中删除所有J.K.罗琳的书籍。在使用DELETE操作时要小心——数据库中没有撤销按钮!

执行事务

事务是将操作分组在一起的方式。如果任何操作失败,它们都会被取消。这是一种“要么全有,要么全无”的方法:

try:
conn.execute("BEGIN TRANSACTION")
cursor.execute("INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
("1984", "乔治·奥威尔", 1949))
cursor.execute("INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
("动物农场", "乔治·奥威尔", 1945))
conn.commit()
print("事务成功!")
except sqlite3.Error as e:
conn.rollback()
print(f"发生错误:{e}")

提交操作

我们在示例中使用了commit()。它对于保存我们对数据库的更改至关重要。没有它,我们的更改在关闭连接时将会丢失。

回滚操作

如果事务中发生了错误,我们可以使用rollback()撤销自上次提交以来所做的所有更改:

try:
# 一些数据库操作
conn.commit()
except sqlite3.Error:
conn.rollback()

PyMySQL模块

虽然SQLite对于学习和小型应用程序很棒,但许多现实世界的项目使用更强大的数据库,比如MySQL。让我们快速看看如何使用PyMySQL:

import pymysql

conn = pymysql.connect(host='localhost',
user='your_username',
password='your_password',
database='your_database')

try:
with conn.cursor() as cursor:
sql = "INSERT INTO users (email, password) VALUES (%s, %s)"
cursor.execute(sql, ('[email protected]', 'very-secret'))
conn.commit()
finally:
conn.close()

基本原理与SQLite相似,但PyMySQL允许我们连接到远程MySQL数据库。

处理错误

在处理数据库时,错误处理至关重要。始终使用try-except块来捕获和处理潜在的错误:

try:
# 数据库操作
except sqlite3.Error as e:
print(f"发生错误:{e}")
finally:
conn.close()

这确保我们优雅地处理错误,并且即使发生错误,也总是关闭数据库连接。

以下是我们在本章中介绍的主要数据库操作的总结表:

操作 描述 示例
连接 建立与数据库的连接 conn = sqlite3common("example.db")
创建 创建新表或记录 cursor.execute("CREATE TABLE...")
插入 向表中添加新记录 cursor.execute("INSERT INTO...")
选择 从数据库中检索数据 cursor.execute("SELECT...")
更新 修改现有记录 cursor.execute("UPDATE...")
删除 从表中删除记录 cursor.execute("DELETE FROM...")
提交 将更改保存到数据库 conn.commit()
回滚 撤销自上次提交以来的更改 conn.rollback()

就这样!你已经迈出了使用Python访问数据库的第一步。记住,熟能生巧,所以不要害怕尝试这些概念。在你意识到之前,你将能够像专业人士一样管理数据!快乐编码,愿你的数据库永远井井有条,没有错误!

Credits: Image by storyset