如何使用 Python 和数据库创建注册应用程序

Python 中的数据库操作:使用 SQLite 实现用户注册功能

Python 标准库中内置了强大的数据库支持功能,这意味着我们可以直接创建和操作数据库,无需依赖像 Django ORM 这样的外部框架。 SQLite 是一个轻量级的数据库,非常适合与 Python 集成。本文将通过一个简单的用户注册应用,深入探讨 Python 数据库编程的基础知识。

如何在 Python 中创建数据库

要在 Python 中创建和使用数据库,你需要两个核心元素:连接(connection)和游标(cursor)。

连接负责建立与数据库的联系,无论是连接到现有数据库还是创建新的数据库。 下面是如何使用 SQLite 在 Python 中创建数据库连接的示例:

import sqlite3

conn = sqlite3.connect('path/to/database.db')
conn.close()

connect() 方法会接收一个现有数据库的路径。如果该路径下不存在数据库文件,则会自动创建一个。完成数据库操作后,务必关闭数据库连接。

游标允许你与连接的数据库进行交互。通过游标,你可以在 Python 程序中执行 SQL 查询。创建游标的方法如下:

cursor = conn.cursor()

cursor.close()

可以通过在已打开的连接对象上调用 cursor() 方法来创建游标。

如何在 Python 中执行数据库事务

通过游标,你可以运行 SQL 语句、查询或脚本,以读取、写入数据或修改数据库结构。

执行数据库事务主要有三种方法:

  • cursor.execute():此方法用于执行单个 SQL 语句。 使用示例如下:
    cursor.execute("""
      CREATE TABLE IF NOT EXISTS users (
        name TEXT,
        age INTEGER
      )
    """)
    

    此代码调用游标上的 execute 方法,并传递一个包含 SQL 语句的字符串。

  • cursor.executemany(): 此方法允许你多次执行相同的 SQL 语句,每次使用不同的参数。它接收两个参数:SQL 语句和一个可迭代对象。 常用于一次性向数据库插入多个对象,示例如下:
    data = [
      ('Alice', 25),
      ('Bob', 30),
      ('Charlie', 22)
    ]
    
    cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", data)

    上面的代码使用 executemany 方法向数据库批量插入数据。

    注意 SQL 语句中的占位符 ?executemany 方法会将它们替换为每个对象中对应的值。

  • cursor.executescript():正如其名称所示,此方法用于执行 SQL 脚本。你可以将 SQL 语句写在单独的文件中,然后使用 executescript 方法来执行它们,如下所示:
    with open("path/to/script.sql") as file:
      sql_script = file.read()
    
    cursor.executescript(sql_script)

如何使用 Python 和 SQLite3 构建注册应用程序

用户注册应用程序的核心逻辑在于使用 Python 获取用户信息并将其存储在数据库中。 以下步骤将引导你使用 Python 和 SQLite3 构建一个简单的注册系统。

第一步:连接到现有数据库或创建新数据库

首先,为你的应用程序创建一个数据库或连接到现有的数据库:

import sqlite3

conn = sqlite3.connect('database.db')
cursor = conn.cursor()
cursor.close()
conn.close()

以上代码创建了一个连接对象和一个游标,用于和数据库交互。

第二步:为用户创建表

你需要一个表来存储用户注册时提供的数据。以下是使用游标创建用户表的方法:

cursor.execute("""
  CREATE TABLE IF NOT EXISTS users (
    first_name TEXT,
    last_name TEXT,
    email TEXT UNIQUE,
    password TEXT
  )
""")

conn.commit()

这段代码将创建一个名为 users 的表,如果该表不存在的话。它包含四列来存储用户信息。其中,email 字段被设置为唯一值,以防止用户使用同一电子邮件创建多个帐户。

conn.commit() 的调用至关重要,它用于将查询提交到数据库。如果没有它,数据库将不会发生任何改变。

如果你使用的是 executescript 方法,你可以在 SQL 文件的末尾添加 COMMIT 关键字,这样就不必调用 conn.commit() 了。

第三步:收集用户数据

Python 函数非常适合代码的复用,所以最好创建一个函数来处理注册功能。该函数将收集用户的名字、姓氏、电子邮件和密码:

def register_user():
  first_name = input("Enter your first name: ")
  last_name = input("Enter your last name: ")
  email = input("Enter your email: ")
  password = input("Enter your password: ")
  password2 = input("Confirm your password: ")

第四步:检查密码正确性

修改 register_user 函数,确保用户两次输入相同的密码。如果两次密码不一致,则应提示用户重新输入。 可以通过循环来实现:

def register_user():
  first_name = input("Enter your first name: ")
  last_name = input("Enter your last name: ")
  email = input("Enter your email: ")

  while True:
    password = input("Enter your password: ")
    password2 = input("Confirm your password: ")

    if password == password2:
      print("You have successfully registered!")
      break
    else:
      print("Your passwords must match")

经过此修改后,除非用户两次输入的密码一致,否则他们将无法完成注册。

第五步:检查电子邮件的唯一性

用于创建用户表的 SQL 语句将电子邮件字段定义为唯一值。这意味着如果用户尝试使用已存在的电子邮件地址注册,数据库会返回一个错误。为了妥善处理这种情况,需要使用 Python 的异常处理机制:

def register_user():
  first_name = input("Enter your first name: ")
  last_name = input("Enter your last name: ")
  while True:
    email = input("Enter your email: ")
    password = input("Enter your password: ")
    password2 = input("Confirm your password: ")

    if password == password2:
      try:
        print("You have successfully created an account.")
        break
      except sqlite3.IntegrityError:
        print("Error: This email is already registered.")
    else:
        print("Your passwords must match.")

此代码使用 try-except 块来捕获重复电子邮件导致的错误。如果数据库抛出 IntegrityError,while 循环将继续,并提示用户输入不同的电子邮件地址。

对于这个简单的示例程序来说,可以认为 IntegrityError 只会因重复的电子邮件地址而发生。在真实的应用中,你可能需要更高级的错误处理机制来处理可能出现的其他问题。

第六步:将用户数据插入数据库

现在,你已经收集并验证了用户数据,是时候将其添加到数据库中了。 你可以使用 SQL 查询来实现此操作。 修改你的 try-except 块如下:

try:
  cursor.execute("""
    INSERT INTO users (first_name, last_name, email, password)
    VALUES (?, ?, ?, ?)
  """, (first_name, last_name, email, password2))
  conn.commit()
  print("You have successfully created an account.")
  break
except sqlite3.IntegrityError:
  print("Error: This email is already registered.")

在修改后的 try-except 块中,游标执行 SQL 插入操作。最后,conn.commit() 方法将 SQL 操作提交到数据库。

如果你完成了以上所有步骤,你应该得到一个可以注册用户并将其保存到数据库的应用程序。你可以使用类似 SQLite 数据库浏览器 的工具来查看数据库的内容:

使用数据库而非集合类型

对于简单的数据库来说,你可能会觉得编写自己的代码会更方便。但是,随着应用程序的增长以及数据库变得更加复杂,请考虑使用 Django ORM 等工具来简化任务。

为了继续练习底层数据库技能,请尝试实现一个登录系统来补充注册程序。