Flask-web开发【Mysql数据库】

安装的软件;

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 创建模型与表的映射;

  1. 模型需要继承db.Model,映射到表中的属性,必须写成db.Column的数据类型。
  • db.Integer 整形
  • db.String varchar,需要指定最长的长度;
  • db.Text text
  1. 其他参数;
  • primary_key:主键
  • autoincrement: 主键自增长
  • Nullable: 字段是否为空;默认可以为空;
  1. 最后需要调用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)

数据库:多对多的;

  1. 建立书和标签的类
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)
  1. 多对多的数据表
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)
                       )
  1. 增加文章和标签,并建立关系;
    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()
  1. 查询文章的所有标签
    article1 = Article.query.filter(Article.title == 'aaa').first()
    tags = article1.tags
    for tag in tags:
        print(tag.name)

Flask-Script 的用法

  1. 作用:通过命令行的形式操作Flask,例如跑一个开发版本的服务器,设置数据库,定时任务。
  2. manage.py主文件
  3. 把一些命令集中在一个文件中,那么在终端需要输入一个父命令,
  4. 例子:
  • 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

  1. db.create_all在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后重新运行,才会重新映射。Flask-migrate可以做到自动映射。
  2. 用pip安装即可。
  3. 使用Flask-migrate必须借助``,这个包的flask-script中包含了所有和数据库相关的命令.
  4. 相关的命令.
python manage.py db init
python manage.py db migrate
python manage.py db upgrage
  • 初始化一个迁移脚本的环境,只需要执行一次。
  • 生成迁移文件,只要模型更改了,就需要执行一次这个命令。
  • 将迁移文件真正的映射到数据库中。
  1. 注意点。
manager = Manager(app)
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand)

你可能感兴趣的:(Flask-web开发【Mysql数据库】)