0
点赞
收藏
分享

微信扫一扫

(学习flask) 04 使用flask-sqlalchemy

夕颜合欢落 2022-04-14 阅读 55
flask

flask使用数据库

这里使用SQLAlchemy关系型数据库框架管理数据库

pip install flask-sqlalchemy
数据库引擎URL
MySQLmysql://username:password@hostname/database
SQLitesqlite:///abspath

1.配置数据库

  • 其中,数据库URL必须存储在SQLALCHEMY_DATABASE_URI键中
  • SQLALCHEMY_COMMIT_ON_TEARDOWN,意为在析构时执行提交操作,即每次请求后都会自动提交数据库中的变动
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

basedir=os.path.abspath(os.path.dirname(__file__))
app=Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///'+os.path.join(basedir,'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
db=SQLAlchemy(app)

2.定义模型

  • 在ORM中,模型一般指的是一个python类,类中的属性对应了数据库表中的类
  • 下面__tablename__是一个内建的属性,用来定义在数据库中,存放该模型的表的表名
  • Column方法的第一个形参指定了数据库中字段的数据类型,第二个形参指定了对字段的约束
  • 最后调用的__repr__方法,返回了一个具有可读性的字符串表示模型,方便调试
class Role(db.Model):
    __tablename__='roles'
    id=db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64), unique=True)
    
    def __repr__(self):
        return '<Role %r>'%self.name

class User(db.Model):
    __tablename__='users'
    id=db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(64), unique=True)

    def __repr__(self):
        return '<User %r>'%self.username

3.定义关系

修改模型的定义

  • relationship方法的第一个参数表明这个关系的另一端是哪个模型,可以使用字符串指定。第二个参数backref向User模型中添加一个role属性,用来定义反向的关系
  • 同时在User模型中指定了外键role_id,对应Role模型中的主键id字段
class Role(db.Model):
	...
	users=db.relationship('User',backref='role')
    def __repr__(self):
        return '<Role %r>'%self.name

class User(db.Model):
	...
    role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
    def __repr__(self):
        return '<User %r>'%self.username

4.命令行新建表并插入数据

  • 这里的db就是上面定义的db=SQLAlchemy(app)
  • 最后必须commit才会生效
>from dbtest import db
>db.create_all()
>admin_role=Role(name='Admin')
>user_role = Role(name='USer')
>user_john=User(username='john',role=admin_role)
>user_alex = User(username='alex', role=user_role)
>db.session.add(admin_role)
>db.session.add(user_role)
>db.session.add(user_john)
>db.session.add(user_alex)
>db.session.commit()

5.修改静态页面

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}dbtest{% endblock %}

{% block content %}
    <div class="page_header">
        <h1>hello,{% if name %}{{name}}{% else %}Stanger{% endif %}!</h1>
        {% if not known %}
        <p>幸会幸会!</p>
        {% else %}
        <p>很高兴再会!</p>
        {% endif %}
    </div>
{{wtf.quick_form(form)}}
{% endblock %}

6.执行效果

在这里插入图片描述

举报

相关推荐

0 条评论