flask模型
-
准备工作
-
安装包
pip install pymysql #python与数据库连接需要的包 pip install flask-sqlalchemy #ORM映射 pip install flask-script #使用该包来进行命令的管理使用 pip install flask-migrate #该包实现模型与数据库的迁移工作
-
配置包
#exts/__init__.py: db = SQLAlchemy() #app.py: app = create_app() #通过工厂fun来创建app manager = Manager(app=app) #通过实例化Manager来封装app migrate = Migrate(app=app, db=db) manager.add_command('db', MigrateCommand) #上述两个命令可以把数据库与manager进行绑定,并向其添加db的命令,该命令本质是MigrateCommand if __name__ == '__main__': manager.run() #通过在app.py文件中进行以上的配置,我们的app就封装完毕了 #terminal: #使用的方式是 python app.py runserver [-h 0.0.0.0 -p 5000] python app.py #会提示可以使用的命令
-
-
使用数据库
-
需要在响应的包下创建models.py文件,文件中的内容为
```python from exts import db
class User(db.Model):
tablename = ‘user’
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(64), nullable=False)
def str(self):
return self.username#可选的数据类型有 ''' Interger, String(size) size是必须要指定的项目, Text 长文本型, DateTime, Boolean 0为False别的为True, PickleType, LargeBinary ''' #可选的参数值有 ''' primary_key = True, autoincrement = True, nullable = False, unique = True, default = datetime.now, 默认值,像这样写可以自动存入当前时间 '''
-
进行数据库与模型的对映和迁移
```python #app.py: from models import User #必须要在app文件中将模型导入,否则要报错 #terminal: python app.py db init #仅执行一次,创建migrations包 python app.py db migrate #迁移 python app.py db upgrade #同步数据库为当前迁移
-
数据库的增删改查
```python #增 user = User() user.username = '张三' user.age = 18 db.session.add(user) db.session.commit() #查 .first() #得到查出来数据的第一个,建议在所有的查询方法后边加first或all,可以避免打印出查询语句 User.query.all() #得所有得数据,结果是列表 User.query.get(pk) #pk可以str/int User.query.filter_by(字段名 = value) User.query.filter(模型名.字段名 == value) User.query.filter(模型名.字段名.endswith('z')).all() User.query.filter(模型名.字段名.startswith('z')).all() User.query.filter(模型名.字段名.contains('z')).all() User.query.filter(模型名.字段名.like('%z%')).all() User.query.filter(模型名.字段名.in_([])).all() User.query.filter(模型名.字段名.__lt__(18).all() User.query.filter(模型名.字段名.__le__(18).all() User.query.filter(模型名.字段名.__gt__(18).all() User.query.filter(模型名.字段名.__ge__(18).all() User.query.filter(模型名.字段名.between(18, 50).all() User.query.filter(User.rtime.__le__(datetime)) User.query.filter(or_()) User.query.filter(and_()) #and_是默认,可以不写 User.query.filter(not_()) User.query.order_by('') User.query.order_by(-User.id) #只有是字段的时候才能-代表从大到小,也能是字符串如age User.query.filter().limit(2).all() #只获取前两条数据 User.query.filter().offset(2).limit(2).all() #跳过前两条数据取两条 #上述的查询是可以进行连用的,建议最后加.first()或.all(),避免得不到预期结果 #删 user = User.query.get(1) user.isdelete = True #逻辑删除 db.session.commit() #提交 db.session.delete(user) #物理删除 db.session.commit() #提交 #改 user = User.query.get(1) user.username = 'new' #更新字段值 user.age = 20 db.session.commit() #提交
-
提高
```python #数据库可以将共通的键进行抽象 class BaseModel(db.Model): __abstract__ = True #该项定义此model是抽象模型 id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(64), nullable=False) #通过继承BaseModel来复用 class User(BaseModel): age = db.Column(db.Integer) gender = db.Column(db.String(4)) def __str__(self): return self.username
-
多表
-
一对多
#User class User(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(15), nullable=False) password = db.Column(db.String(64), nullable=False) articles = db.relationship('Article', backref='user') #Article class Article(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(50), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
-
多对多
class Page(db.Model): id = db.Column(db.Integer, primary_key=True) tags = db.relationship('Tag', secondary='Page_tag', backref='page') class Tag(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20),nullable=False) class Page_tag(db.Model): id = db.Column(db.Integer, primary_key=True) p_id = db.Column(db.Interger, db.ForeignKey('page.id')) t_id = db.Column(db.Interger, db.ForeignKey('Tag.id'))
-
-
分页器
pagination = User.query.paginate(page, per_page) pagination.items #每个取到的user pagination.page #当前页码 pagination.prev_num #上页码 pagination.next_num #下页码 pagination.has_next #是否有下 pagination.has_prev #是否有上 pagination.pages #总页数 pagination.total #总数据数