杰瑞科技汇

Python SQLite如何创建数据库?

SQLite 是一个轻量级的、基于文件的嵌入式数据库引擎,它不需要单独的服务器进程,这使得它非常适合小型应用、移动应用、桌面应用以及作为原型开发的工具。

Python SQLite如何创建数据库?-图1
(图片来源网络,侵删)

核心步骤

在 Python 中使用 SQLite 主要分为以下几个步骤:

  1. 导入 sqlite3 模块:Python 标准库自带了这个模块,无需额外安装。
  2. 连接到数据库
    • 如果数据库文件(.db)存在,则连接到它。
    • 如果数据库文件不存在,SQLite 会自动创建一个新的数据库文件。
  3. 创建一个游标:游标就像一个指针,允许你执行 SQL 命令并获取结果。
  4. 编写并执行 SQL 命令:使用游标的 execute() 方法来创建表、插入数据、查询数据等。
  5. 提交更改:对于写操作(如 INSERT, UPDATE, DELETE),必须调用连接对象的 commit() 方法,否则更改不会被保存到数据库文件中。
  6. 关闭连接:操作完成后,关闭游标和连接,释放资源。

示例1:创建数据库、表并插入数据

这是一个完整的、从零开始的示例,展示了如何创建一个名为 mydatabase.db 的数据库,并在其中创建一个 users 表。

import sqlite3
# 1. 连接到数据库
# mydatabase.db 文件不存在,它会被自动创建
# 如果文件已存在,则连接到该数据库
try:
    # connection 对象表示数据库连接
    connection = sqlite3.connect('mydatabase.db')
    # 2. 创建一个游标对象
    # cursor 对象用于执行 SQL 命令
    cursor = connection.cursor()
    # 3. 创建一个表
    # 使用 CREATE TABLE IF NOT EXISTS 避免重复创建时出错
    print("正在创建表...")
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL UNIQUE,
        age INTEGER
    )
    ''')
    print("表 'users' 创建成功或已存在。")
    # 4. 向表中插入数据
    # 使用 ? 作为占位符,可以防止 SQL 注入攻击,这是推荐的做法
    print("正在插入数据...")
    new_users = [
        ('Alice', 'alice@example.com', 30),
        ('Bob', 'bob@example.com', 25),
        ('Charlie', 'charlie@example.com', 35)
    ]
    # executemany() 用于批量插入
    cursor.executemany("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", new_users)
    # 5. 提交更改
    # 对于写操作,必须调用 commit() 来保存更改
    connection.commit()
    print(f"成功插入了 {cursor.rowcount} 条数据。")
except sqlite3.Error as e:
    print(f"数据库错误: {e}")
finally:
    # 6. 关闭游标和连接
    # 确保无论是否发生错误,资源都会被正确释放
    if connection:
        cursor.close()
        connection.close()
        print("数据库连接已关闭。")

执行后,你会看到在你的 Python 脚本同目录下,生成了一个 mydatabase.db 文件。


示例2:查询数据

现在我们来查询刚刚创建的 users 表中的数据。

Python SQLite如何创建数据库?-图2
(图片来源网络,侵删)
import sqlite3
# 连接到已存在的数据库
try:
    connection = sqlite3.connect('mydatabase.db')
    cursor = connection.cursor()
    # 执行 SELECT 查询
    print("正在查询所有用户...")
    cursor.execute("SELECT id, name, email, age FROM users")
    # 获取查询结果
    # fetchall() 获取所有行,返回一个元组列表
    users = cursor.fetchall()
    # 打印结果
    print("用户列表:")
    for user in users:
        print(f"ID: {user[0]}, 姓名: {user[1]}, 邮箱: {user[2]}, 年龄: {user[3]}")
except sqlite3.Error as e:
    print(f"数据库错误: {e}")
finally:
    if connection:
        cursor.close()
        connection.close()
        print("数据库连接已关闭。")

输出:

正在查询所有用户...
用户列表:
ID: 1, 姓名: Alice, 邮箱: alice@example.com, 年龄: 30
ID: 2, 姓名: Bob, 邮箱: bob@example.com, 年龄: 25
ID: 3, 姓名: Charlie, 邮箱: charlie@example.com, 年龄: 35
数据库连接已关闭。

重要概念和最佳实践

使用 with 语句(推荐)

with 语句可以自动管理资源,即使发生异常,也能确保连接被正确关闭,这比手动 try...finally 更简洁。

import sqlite3
# with 语句会自动处理连接的打开和关闭
with sqlite3.connect('mydatabase.db') as connection:
    cursor = connection.cursor()
    # 执行操作
    cursor.execute("SELECT name FROM users WHERE age > 28")
    older_users = cursor.fetchall()
    print("年龄大于28的用户:")
    for user in older_users:
        print(user[0])
    # 不需要手动调用 connection.close()
    # with 语句块结束时,连接会自动关闭

参数化查询(防止 SQL 注入)

永远不要使用 Python 的字符串格式化(如 f"..." 或 )来构建 SQL 查询,这会导致严重的SQL 注入安全漏洞。

错误的做法 (危险!):

Python SQLite如何创建数据库?-图3
(图片来源网络,侵删)
user_name = "Alice"
# 不要这样做!
sql = f"SELECT * FROM users WHERE name = '{user_name}'"
cursor.execute(sql)

正确的做法 (安全!): 使用 作为占位符,并将参数作为元组传递给 execute() 方法。

user_name = "Alice"
# 使用 ? 作为占位符
sql = "SELECT * FROM users WHERE name = ?"
# 参数作为元组传递
cursor.execute(sql, (user_name,)) 
# 注意:即使只有一个参数,也必须写成元组形式 (user_name,)

获取数据的其他方法

  • fetchone(): 获取查询结果的第一行,返回一个元组,如果结果为空,则返回 None
  • fetchmany(size): 获取指定数量的行,返回一个元组列表。
with sqlite3.connect('mydatabase.db') as conn:
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
    print("--- 使用 fetchone() ---")
    first_user = cursor.fetchone()
    print("第一个用户:", first_user)
    print("\n--- 使用 fetchmany(2) ---")
    next_two_users = cursor.fetchmany(2)
    print("接下来的两个用户:", next_two_users)

将查询结果转换为字典

默认情况下,fetchall() 返回的是元组,如果你想通过列名来访问数据,可以使用 sqlite3.Row 对象。

import sqlite3
# 将 row_factory 设置为 sqlite3.Row
# 这样,游标就会返回字典一样的行对象
with sqlite3.connect('mydatabase.db') as connection:
    connection.row_factory = sqlite3.Row
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM users WHERE name = 'Bob'")
    bob = cursor.fetchone() # fetchone() 返回一个 Row 对象
    if bob:
        # 现在可以通过列名访问数据,就像字典一样
        print(f"Bob 的邮箱: {bob['email']}")
        print(f"Bob 的年龄: {bob['age']}")

步骤 代码 说明
导入 import sqlite3 加载 Python 的 SQLite 模块。
连接 conn = sqlite3.connect('mydb.db') 连接或创建数据库文件。
创建游标 cursor = conn.cursor() 获取一个执行 SQL 命令的对象。
执行 SQL cursor.execute("CREATE TABLE ...") 使用游标执行 SQL 语句。
提交 conn.commit() 仅对写操作:保存更改到磁盘。
关闭 cursor.close()
conn.close()
释放资源,使用 with 语句可自动完成。

遵循这些步骤和最佳实践,你就可以在 Python 中安全、高效地使用 SQLite 数据库了。

分享:
扫描分享到社交APP
上一篇
下一篇