flask使用数据库
这里使用SQLAlchemy关系型数据库框架管理数据库
pip install flask-sqlalchemy
数据库引擎 | URL |
---|---|
MySQL | mysql://username:password@hostname/database |
SQLite | sqlite:///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 %}