记录:创建个人博客网站(基于FLASK)2.2建立数据库的连接
2.2、 建立数据库的连接
在本项目中,没有使用FLASK官方教程的sqlite3数据库
,而是使用的本地的Mysql数据库
。
采用了flask_sqlalchemy
库,实现了与目标数据库的映射。
通过调用click
库,实现了在终端窗口输入命令行的形式来初始化数据库:
ps c:/> flask --app init-db
# flaskr/db.py
from flask_sqlalchemy import SQLAlchemy
from flask import Flask,current_app,g
from sqlalchemy import create_engine,Engine,text
from sqlalchemy.orm import sessionmaker
import click
#采用orm来初始化数据库
def initialize_db(app:Flask):
with app.app_context():
if 'db' not in g:
g.db = SQLAlchemy(app)
import flaskr.models
g.db.create_all()
print("db-models create successfully!")
# 采用sql语句的方式来初始化数据库
def get_db():
if 'db' not in g:
g.db = create_engine(current_app.config.get("SQLALCHEMY_DATABASE_URI"))
return g.db
# 关闭数据库
def close_db(e=None):
db:Engine = g.pop('db',None)
Session = sessionmaker(bind=db)
db_session = Session()
if db is not None:
db_session.close()
# 通过读取flaskr/schema.sql的sql语句来,来创建数据表
def init_db():
db = get_db()
with current_app.open_resource('schema.sql',mode="r") as f:
Session = sessionmaker(bind=db)
db_session = Session()
script = f.read()
# 分割 SQL 语句(这里假设每个语句以分号结束)
statements = script.strip().split(';')
# 逐条执行 SQL 语句
for statement in statements:
# 跳过空语句
if statement.strip():
print(statement)
db_session.execute(text(statement))
# 通过导入click模块的command命令来实现从终端命令实现数据表的初始化
@click.command('init-db')
def init_db_command():
"""Clear the existing data and create new tables."""
init_db()
click.echo('Initialized the database.')
def init_app(app):
# app.teardown_appcontext(close_db)
app.cli.add_command(init_db_command)
采用的建表SQL语句如下:
在flaskr\schema.sql路径下
DROP TABLE IF EXISTS blog;
DROP TABLE IF EXISTS user;
CREATE TABLE user (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
username varchar(20) UNIQUE NOT NULL,
password_hash varchar(255) NOT NULL
);
CREATE TABLE blog (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
author_id INTEGER NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
title varchar(50) NOT NULL,
body TEXT NOT NULL,
FOREIGN KEY (author_id) REFERENCES user (id)
);
在本项目中通过逐条读取schema.sql语句中的文本,来执行sql语句,直到所有的sql语句读取、执行完毕。