https://flask.palletsprojects.com/en/1.1.x/
애플리케이션은 SQLite 데이터베이스를 사용하여 사용자 및 게시물을 저장합니다. 파이썬은 sqlite3 모듈 에서 SQLite를 기본적으로 지원 합니다.
SQLite는 별도의 데이터베이스 서버를 설정할 필요가 없으며 Python에 내장되어있어 편리합니다. 그러나 동시 요청이 동시에 데이터베이스에 쓰려고하면 각 쓰기가 순차적으로 수행 될 때 속도가 느려집니다. 작은 응용 프로그램에서는이를 알 수 없습니다. 커지면 다른 데이터베이스로 전환 할 수 있습니다.
SQLite 데이터베이스 (및 대부분의 다른 Python 데이터베이스 라이브러리)로 작업 할 때 가장 먼저해야 할 일은 데이터베이스에 대한 연결을 만드는 것입니다. 모든 쿼리 및 작업은 연결을 사용하여 수행되며 작업이 완료된 후 닫힙니다.
웹 애플리케이션에서이 연결은 일반적으로 요청에 연결됩니다. 요청을 처리 할 때 생성되며 응답이 전송되기 전에 닫힙니다.
flaskr/db.py
import sqlite3
import click
from flask import current_app, g
from flask.cli import with_appcontext
def get_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):
db = g.pop('db', None)
if db is not None:
db.close()
g
: 각 요청마다 고유 한 특수 객체입니다. 요청하는 동안 여러 기능으로 액세스 할 수있는 데이터를 저장하는 데 사용됩니다. get_db동일한 요청에서 두 번째로 호출되는 경우 새 연결을 작성하는 대신 연결이 저장되고 재사용됩니다.current_app
: 요청을 처리하는 Flask 응용 프로그램을 가리키는 또 다른 특수 객체입니다. 응용 프로그램 팩토리를 사용 했으므로 나머지 코드를 작성할 때 응용 프로그램 객체가 없습니다. get_db응용 프로그램이 만들어지고 요청을 처리 할 때 호출되므로 current_app사용할 수 있습니다.sqlite3.connect()
: DATABASE구성 키가 가리키는 파일에 대한 연결을 설정합니다. 이 파일은 아직 존재하지 않아도되며 나중에 데이터베이스를 초기화 할 때까지는 없습니다.sqlite3.Rowdicts
: dict처럼 동작하는 행을 반환하도록 연결에 지시합니다. 이름으로 열에 액세스 할 수 있습니다.SQLite에서 데이터는 테이블 과 열에 저장됩니다. 데이터를 저장하고 검색하려면 먼저 테이블을 작성해야합니다. Flaskr은 user테이블에 사용자를 저장하고 테이블에 게시물을 게시 post합니다. 빈 테이블을 작성하는 데 필요한 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)
);
이 SQL 명령을 실행할 Python 함수를 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')
@with_appcontext
def init_db_command():
"""Clear the existing data and create new tables."""
init_db()
click.echo('Initialized the database.')
open_resource()
: flaskr패키지와 관련된 파일을 엽니다. 이는 나중에 응용 프로그램을 배포 할 때 해당 위치가 어디에 있는지 알 필요가 없기 때문에 유용합니다. get_db 파일에서 읽은 명령을 실행하는 데 사용되는 데이터베이스 연결을 반환합니다.click.command()
: 함수 init-db 를 호출 init_db하고 사용자에게 성공 메시지를 표시 하는 명령 줄 명령을 정의합니다 . 명령 행 인터페이스 를 읽고 명령 작성에 대해 자세히 알아볼 수 있습니다.close_db
및 init_db_command
기능은 응용 프로그램 인스턴스에 등록해야합니다. 그렇지 않으면 응용 프로그램에서 사용되지 않습니다. 그러나 팩토리 함수(flaskr/__init__.py
)를 사용하고 있으므로 함수를 작성할 때 해당 인스턴스를 사용할 수 없습니다. 대신 응용 프로그램을 작성하고 등록을 수행하는 함수를 작성하십시오.
flaskr/db.py
def init_app(app):
app.teardown_appcontext(close_db)
app.cli.add_command(init_db_command)
app.teardown_appcontext()
: 응답을 반환 한 후 정리할 때 Flask에 해당 함수를 호출하도록 지시합니다.app.cli.add_command()
: 명령으로 호출 할 수있는 새 명령을 추가합니다 flask.flaskr/__init__.py
def create_app():
app = ...
# existing code omitted
from . import db
db.init_app(app)
return app
이제 init-db
앱에 등록되었으므로 이전 페이지 flask의 run명령 과 비슷한 명령을 사용하여 호출 할 수 있습니다.
$ flask init-db
Initialized the database.