Python Flask SQLite 数据库设置

FlaskFlaskBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习如何使用 Python Flask 框架定义和访问 SQLite 数据库。我们将设置一个 SQLite 数据库,建立与它的连接,创建表,并初始化数据库。

注意:你需要自己创建代码文件并在环境中运行它。你可以在 Web 5000 上预览 Flask 服务状态。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL flask(("Flask")) -.-> flask/CoreConceptsGroup(["Core Concepts"]) flask(("Flask")) -.-> flask/DataHandlingGroup(["Data Handling"]) flask(("Flask")) -.-> flask/DevelopmentToolsGroup(["Development Tools"]) flask/DataHandlingGroup -.-> flask/incoming_request_data("Incoming Request Data") flask/DataHandlingGroup -.-> flask/application_globals("Application Globals") flask/DataHandlingGroup -.-> flask/response_objects("Response Objects") flask/CoreConceptsGroup -.-> flask/application_object("Application Object") flask/CoreConceptsGroup -.-> flask/sessions("Sessions") flask/CoreConceptsGroup -.-> flask/session_interface("Session Interface") flask/CoreConceptsGroup -.-> flask/useful_internals("Useful Internals") flask/DevelopmentToolsGroup -.-> flask/blueprint_objects("Blueprint Objects") flask/DevelopmentToolsGroup -.-> flask/command_line_interface("Command Line Interface") subgraph Lab Skills flask/incoming_request_data -.-> lab-136336{{"Python Flask SQLite 数据库设置"}} flask/application_globals -.-> lab-136336{{"Python Flask SQLite 数据库设置"}} flask/response_objects -.-> lab-136336{{"Python Flask SQLite 数据库设置"}} flask/application_object -.-> lab-136336{{"Python Flask SQLite 数据库设置"}} flask/sessions -.-> lab-136336{{"Python Flask SQLite 数据库设置"}} flask/session_interface -.-> lab-136336{{"Python Flask SQLite 数据库设置"}} flask/useful_internals -.-> lab-136336{{"Python Flask SQLite 数据库设置"}} flask/blueprint_objects -.-> lab-136336{{"Python Flask SQLite 数据库设置"}} flask/command_line_interface -.-> lab-136336{{"Python Flask SQLite 数据库设置"}} end

设置数据库

首先,我们需要设置一个 SQLite 数据库来存储用户和帖子。SQLite 是一个方便的选择,因为它不需要单独的数据库服务器,并且是 Python 内置的。

在我们的 Flask 应用程序中,我们将创建一个到 SQLite 数据库的连接。在 Web 应用程序中,此连接通常与请求相关联,并在工作完成后关闭。

使用 sqlite3.connect 函数建立连接,我们使用 Flask 的特殊对象 g 来存储和重用该连接。

创建一个新的 Python 文件 db.py 并添加以下代码:

## flaskr/db.py

import sqlite3
from flask import current_app, g

def get_db():
    ## 检查 'g' 中是否不存在 'db'
    if 'db' not in g:
        ## 建立到数据库的连接
        g.db = sqlite3.connect(
            current_app.config['DATABASE'],
            detect_types=sqlite3.PARSE_DECLTYPES
        )
        ## 返回行为类似于字典的行
        g.db.row_factory = sqlite3.Row

    return g.db

def close_db(e=None):
    ## 从 'g' 中弹出 'db' 并在存在时关闭连接
    db = g.pop('db', None)

    if db is not None:
        db.close()

创建表

在 SQLite 中,数据存储在表和列中。在我们能够存储和检索数据之前,需要先创建这些表。我们的应用程序将把用户存储在 user 表中,把帖子存储在 post 表中。

创建一个新的 SQL 文件 schema.sql 并添加以下代码:

## flaskr/schema.sql

DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS post;

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);

初始化数据库

接下来,我们将添加 Python 函数来运行创建表的 SQL 命令。将以下函数添加到 db.py 文件中:

## flaskr/db.py

def init_db():
    db = get_db()

    with current_app.open_resource('schema.sql') as f:
        db.executescript(f.read().decode('utf8'))

@click.command('init-db')
def init_db_command():
    """Clear the existing data and create new tables."""
    init_db()
    click.echo('Initialized the database.')

向应用程序注册

close_dbinit_db_command 函数需要向应用程序实例注册,以便应用程序使用。由于我们使用的是工厂函数,我们将编写一个接受应用程序并进行注册的函数。

将以下函数添加到 db.py 文件中:

## flaskr/db.py

def init_app(app):
    app.teardown_appcontext(close_db)
    app.cli.add_command(init_db_command)

然后,从工厂函数中导入并调用此函数。将以下代码添加到 __init__.py 文件中:

## flaskr/__init__.py

def create_app():
    app =...
    ## 省略现有代码

    from. import db
    db.init_app(app)

    return app

初始化数据库文件

既然 init-db 已经在应用中注册,那么就可以使用 flask 命令来调用它。

运行 init-db 命令:

flask --app flaskr init-db
Initialized the database.

总结

在这个实验中,我们学习了如何使用 Python Flask 框架来定义和访问 SQLite 数据库。我们创建了到数据库的连接,创建了表,并初始化了数据库。这对于任何需要从数据库存储和检索数据的 Web 应用程序来说都是基础。