• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
leo130-blogs
博客园    首页    新随笔    联系   管理    订阅  订阅

记录:创建个人博客网站(基于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语句读取、执行完毕。


posted @ 2024-04-24 17:52  Sanchez023  阅读(52)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3