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) 编辑 收藏 举报