Flask Turtoial(数据库)

Flask-SQLAlchemy关系型数据库映射器 /ORM(全全称Object Relation Mapping)

ORMs允许应用程序使用高级实体(类User,对象yang, 方法User.query.filter_by(username='xxx').first()),而不是表和SQL来管理数据库.执行在对象的操作会被ORMs翻译成数据库命令,这意味着不需要使用SQL语言

models.py

from app import db


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))

    def __repr__(self):
        return '<User {}>'.format(self.username)

repr的作用

>>> u = User(username='susan', email='susan@example.com')
>>> u
<User susan>
flask db init 生成migrations文件夹,对应有数据库迁移的版本
flask db migrate -m "add users table"  # 生成迁移脚本,但不对数据库进行更改
flask db upgrade # 应用更改


如果想回退的话流程是:
flask db downgrade 回退修改
手动删除对应的迁移脚本

定义Post类

app/models.py

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    # 在一这一侧定义relationship
    posts = db.relationship('Post', backref='author', lazy='dynamic')

    def __repr__(self):
        return '<User {}>'.format(self.username)


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(140))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    user_id = db.Column(db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Post {}>'.format(self.body)

Post类代表用户撰写的blog,timestamp可以提供给我们按时间检索帖子的方法,因此默认defaut使用datetime.utcnow方法传递,而不是返回结果.

如何添加用户? 比如叫john

python
>>> from app import db
>>> from app.models import User, Post
>>> u = User(username='john', email='susan@example.com')
>>> db.session.add(u)
>>> db.session.commit()

如何查询所有用户?

>>> users = User.query.all()

>>> users
[<User john>, <User susan>]

>>> for u in users:
	    print(u.id , u.username)
	    
1 john
2 susan

当你知道用户id的时候呢?如何查询?

u = User.query.get(1)
>>> u

<User john>

添加一篇文章呢?

u = User.query.get(1)
p = Post(body='my first post!', author=u)
db.session.add(p)
db.session.cmmit()

由于我之前在User类中,定义过posts字段,即db.relationship,

在关联中,设置了一个虚拟的字段author(backref=author),这样我可使用(author=user)来生成post实例

其他

>>> # get all posts written by a user
>>> u = User.query.get(1)
>>> u
<User john>

# 这里注意  u.posts方法使用的是dynamic查询方法
>>> posts = u.posts.all()
>>> posts
[<Post my first post!>]
 
>>> # same, but with a user that has no posts
>>> u = User.query.get(2)
>>> u
<User susan>
>>> u.posts.all()
[]
 
>>> # print post author and body for all posts 
>>> posts = Post.query.all()
>>> for p in posts:
...     print(p.id, p.author.username, p.body)
...
1 john my first post!
 
# get all users in reverse alphabetical order
>>> User.query.order_by(User.username.desc()).all()
[<User susan>, <User john>]

删除测试数据

>>> users = User.query.all()
>>> for u in users:
...     db.session.delete(u)
...
>>> posts = Post.query.all()
>>> for p in posts:
...     db.session.delete(p)
...
>>> db.session.commit()

Shell上下文

在python解释器中,想要获取app的对象,需要先import

而shell上下文可以直接启动python解释器,并导入变量

只需要在microblog.py启动文件中写入:

from app import app, db
from app.models import User, Post

@app.shell_context_processor
def make_shell_context():
    return {'db': db, 'User': User, 'Post': Post}

User有哪些字段? Post有哪些字段?哪些字段需要索引? 那些需要唯一?外键在那定义?外键写在哪? 需要放在Column里面吗?里的值填什么? relationship在哪定义?需要放在Column里面吗?写法是什么?

在Post字段中的,字段timestamp调用的是什么方法? 什么库中的什么? 是值还是方法? 为什么要这么调用?

@app.shell_context_processor 装饰符为shell上下文注册功能.

当flask shell运行的时候,调用此函数并注册函数中的项

posted on 2020-08-28 20:51  sunnywillow  阅读(129)  评论(0编辑  收藏  举报