(学习flask) 04 使用flask-sqlalchemy

这篇博客介绍了如何在Flask应用中集成SQLAlchemy,用于管理SQLite或MySQL数据库。首先,配置数据库URL并设置提交选项。接着,定义数据模型,如Role和User,并建立它们之间的关系。然后,通过命令行创建表并插入初始数据。最后,展示了如何在模板中使用这些数据。
摘要由CSDN通过智能技术生成

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.执行效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值