安装的软件;
mysqlclient
flask_sqlalchemy
pymysql
创建数据库
create database xxx; # xxx为将要创建的数据库的名字;
创建数据表
create table article(
id int primary key auto_increment,
title varchar(100) not null,
content text not null
);
使用flask_sqlalchemy 创建模型与表的映射;
- 模型需要继承db.Model,映射到表中的属性,必须写成
db.Column
的数据类型。
- db.Integer 整形
- db.String varchar,需要指定最长的长度;
- db.Text text
- 其他参数;
- primary_key:主键
- autoincrement: 主键自增长
- Nullable: 字段是否为空;默认可以为空;
- 最后需要调用db.create_all ,讲模型创建到数据库。
使用flask_sqlalchemy 增删改查
- 增
a1 = Article(title=u'aaa',content='bbb')
db.session.add(a1)
# 事务;
db.session.commit()
- 查
result = Article.query.filter(Article.title == 'aaa').all()
只看第一条:
result = Article.query.filter(Article.title == 'aaa').first()
- 改
- 先把数据找出来。
- 修改数据
- 事务提交
result = Article.query.filter(Article.title == 'aaa').first()
result.title = 'new title'
db.session.commit()
- 删
- 找出要删除的数据;
- 删除
- 事务提交
result = Article.query.filter(Article.title == 'aaa').first()
db.session.delete(result)
db.session.commit()
flask_sqlalchemy 外键及其关系
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(100),nullable=False)
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100),nullable=False)
content = db.Column(db.Text,nullable=False)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
author = db.relationship('User',backref=db.backref('articles'))
定义的两个类
author = db.relationship('User',backref=db.backref('articles'))
- 给
Article
这个模型增加一个author
, -
backref
定义反向引用,可以通过User.articles
访问这个模型所写的所有文章.
增加作者:普通方法
u1 = User(username='zzz')
db.session.add(u1)
db.session.commit()
增加文章:普通方法
a1 = Article(title='as',content='bbbbb',author_id=1)
db.session.add(a1)
db.session.commit()
查找文章:普通方法
aa = Article.query.filter(Article.title=='as').first()
a_id = aa.author_id
user = User.query.filter(User.id == a_id).first()
增加文章:高级方法
ar1 = Article(title='asas', content='bbbb')
ar1.author = User.query.filter(User.id == 1).first()
db.session.add(ar1)
db.session.commit()
查找文章:高级方法
article = Article.query.filter(Article.title=='as').first()
a = article.author.username
查找某位作者的全部文章:高级方法
user2 = User.query.filter(User.username == 'zhi').first()
result = user2.articles
for articlea in result:
print(articlea.title)
数据库:多对多的;
- 建立书和标签的类
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
# tags
tags = db.relationship('Tag',secondary=article_tag,backref=db.backref('articles'))
class Tag(db.Model):
__tablename__ = 'tag'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100), nullable=False)
- 多对多的数据表
article_tag = db.Table('article_tag',
db.Column('article_id',db.Integer,db.ForeignKey('article.id'),primary_key=True),
db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'),primary_key=True)
)
- 增加文章和标签,并建立关系;
ar1 = Article(title='aaa')
ar2 = Article(title='bbb')
tag1 = Tag(name='111')
tag2 = Tag(name='222')
ar1.tags.append(tag1)
ar1.tags.append(tag2)
ar2.tags.append(tag1)
ar2.tags.append(tag2)
db.session.add(ar1)
db.session.add(ar2)
db.session.add(tag1)
db.session.add(tag2)
db.session.commit()
- 查询文章的所有标签
article1 = Article.query.filter(Article.title == 'aaa').first()
tags = article1.tags
for tag in tags:
print(tag.name)
Flask-Script 的用法
- 作用:通过命令行的形式操作Flask,例如跑一个开发版本的服务器,设置数据库,定时任务。
-
manage.py
主文件 - 把一些命令集中在一个文件中,那么在终端需要输入一个父命令,
- 例子:
- manage.py
from flask_script import Manager
from flask_script_demo import app
from db_script import DBmanager
manager = Manager(app)
@manager.command
def runserver():
print('running')
manager.add_command('db',DBmanager)
if __name__ == '__main__':
manager.run()
- db_script.py
from flask_script import Manager
DBmanager = Manager()
@DBmanager.command
def init():
print('init mysql')
@DBmanager.command
def migrate():
print('数据库迁移')
- flask_script_demo.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello'
if __name__ == '__main__':
app.run()
Flask-migrate
-
db.create_all
在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后重新运行,才会重新映射。Flask-migrate可以做到自动映射。 - 用pip安装即可。
- 使用
Flask-migrate
必须借助``,这个包的flask-script
中包含了所有和数据库相关的命令. - 相关的命令.
python manage.py db init
python manage.py db migrate
python manage.py db upgrage
- 初始化一个迁移脚本的环境,只需要执行一次。
- 生成迁移文件,只要模型更改了,就需要执行一次这个命令。
- 将迁移文件真正的映射到数据库中。
- 注意点。
manager = Manager(app)
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand)