python-Web-flask-数据库

3 数据库:

Flask-SQLAlchemy 安装及连接

pip install flask-sqlalchemy

pip install flask-mysqldb

# 数据库链接地址

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'# 动态追踪修改设置,如未设置只会提示警告

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

字段类型:IntegerFloatStringTextBooleanDateTime

选项:primary_keyuniqueindexnullable

关系选项:backrefprimary joinorder_bysecondarysecondary join

 

使用数据库增删该查

#创建SQLAlchemy对象,读取app中配置信息

db = SQLAlchemy(app)#定义角色模型(一方)

class Role(db.Model):

    # 定义表名

    __tablename__ = 'roles'

    # 定义列对象

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64), unique=True)

    #设置关系属性,方便查询使用

    us = db.relationship('User', backref='role')

    #重写__repr__方法,方便查看对象输出内容

    def __repr__(self):

        return 'Role:%s'% self.name

if __name__ == '__main__':

    #删除所有和db相关联的表

    db.drop_all()

    #创建所有和db相关联的表

    db.create_all()

app.run(debug=True)

# 一对多

class Role(db.Model):

    #关键代码反向查寻

    us = db.relationship('User', backref='role', lazy='dynamic')

    ...

class User(db.Model):

    # 外键

    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

db.session.add(obj) 添加对象

db.session.delete(obj) 删除对象

db.session.commit() 提交会话

db.session.rollback() 回滚

db.session.remove() 移除会话

filter()Limitorder_by()group_by()

all()first()count()

User.query.filter_by(name='wang').all()

User.query.first()

User.query.all()

User.query.filter(User.name.endswith('g')).all() # 模糊

User.query.get(1) # 主键id=1

User.query.filter(User.name!='wang').all() # 不等与wang

from sqlalchemy import not_

User.query.filter(not_(User.name=='chen')).all() # 取反

from sqlalchemy import and_ or_

User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()#

# 查询后删除

user = User.query.first()

db.session.delete(user)

db.session.commit()

User.query.all()

# 更新

user = User.query.first()

user.name = 'dong'

db.session.commit()

User.query.first()

 

全局钩子

# 导入表单扩展 生成form表单 自带前端验证

from wtforms import Form,StringField,PasswordField,SubmitField,validators

# 自定义表单类 控制我们的表单字段

class BookAddForm(Form):

    # 文本框

  uname = StringField(label="用户名:",validators=[validators.DataRequired()])

  upass = PasswordField(label="密码:")

    usub = SubmitField(label='注册')

 

# upass = PasswordField()

‘’’html’’’

{#  <p> {{ bookaddform.uname.label }}{{ bookaddform.uname }}</p>#}

{#  <p> {{ bookaddform.upass.label }}{{ bookaddform.upass }}</p>#}

 

数据库迁移

pip install flask-migrate

#这个命令会创建migrations文件夹,所有迁移文件都放在里面。

from flask_script import Shell,Manager

from flask_migrate import Migrate,MigrateCommand

manager = Manager(app)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/Flask_test'

app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

db = SQLAlchemy(app)

#第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例

migrate = Migrate(app,db)

#manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令

manager.add_command('db',MigrateCommand)

Manager.run()

 

命令:

python database.py db init // 迁移初始化

python database.py db migrate -m 'initial migration' // 命名和添加迁移

python database.py db upgrade // 提交到数据库

python app.py db history // 返回以前的所有版本

输出格式:<base> ->  版本号 (head), initial migration

回滚到指定版本

python app.py db downgrade 版本号

 

Rollback:

# 所有的数据处理准备好之后,执行commit才会提交到数据库!

                try:

                    book_name = request.form.get('book_name')

                    bo = Book(name=book_name,author_id=auth.id)

                    # 添加书籍

                    db.session.add(bo)

                    db.session.commit()

                except Exception as e:

                    # 加入数据库commit提交失败,必须回滚!!!

                    db.session.rollback()

                    raise e

 

posted @ 2019-08-23 16:10  一觉昏睡人  阅读(200)  评论(0编辑  收藏  举报