• flask操作数据库


    1.环境安装

    1.python3.85

    2.模块

    pip3 install flask -i https://pypi.douban.com/simple

    pip3 install pymysql -i https://pypi.douban.com/simple

    pip3 install flask-script -i https://pypi.douban.com/simple

    pip3 install flask-sqlalchemy -i https://pypi.douban.com/simple

    pip3 install flask-migrate==2.7.0 -i https://pypi.douban.com/simple

    pip3 install SQLAlchemy -i https://pypi.douban.com/simple

     pymysql:建立联系

    flask-sqlalchemy:orm

    flask-script:自定义命令

    flask-migrate:制作命令

    配置 settings.py

    1. class DevConfig:
    2. DEBUG = True
    3. # 数据库连接配置,必须的,格式为(数据库+数据库驱动://数据库用户名:密码@数据库主机地址:端口号/数据库名称)
    4. my_config = {
    5. "MYSQL": "mysql",
    6. "CYMSQL": "pymysql",
    7. "ACCOUNT": "root",
    8. "PASSWORD": 'foobared',
    9. "ADDRESS": "127.0.0.1",
    10. "PORT": 3306,
    11. "DATABASENAME": "ymq"
    12. }
    13. SQLALCHEMY_DATABASE_URI = "{MYSQL}+{CYMSQL}://{ACCOUNT}:{PASSWORD}@{ADDRESS}:{PORT}/{DATABASENAME}".format(
    14. **my_config)
    15. SQLALCHEMY_TRACK_MODIFICATIONS = False # 为True时,flask-sqlalchemy会跟踪对象的修改
    16. SQLALCHEMY_ECHO = True

    exts包里面

    1. # sqlalchemy实例化 第二种创建方式
    2. from flask_sqlalchemy import SQLAlchemy
    3. db = SQLAlchemy()

    初始化

    1. from flask import Flask
    2. from settings import dev
    3. from apps.user.view import user_bp
    4. from exts import db
    5. def create_app():
    6. app = Flask(__name__, template_folder='../templates', static_folder='../static')
    7. app.config.from_object(dev.DevConfig)
    8. # 蓝图注册
    9. app.register_blueprint(user_bp)
    10. # db初始化
    11. db.init_app(app=app)
    12. return app

    实例化

    1. from apps import create_app
    2. from flask_script import Manager
    3. from flask_migrate import Migrate, MigrateCommand
    4. from exts import db
    5. app = create_app()
    6. # 构建命令
    7. manager = Manager(app=app)
    8. # 将db交给manager
    9. migrate = Migrate(app=app, db=db)
    10. manager.add_command('db', MigrateCommand)
    11. if __name__ == '__main__':
    12. manager.run()

    操作

    # 只有第一次初始化

    python app.py db init

    # 记录数据
    python app.py db migrate

    # 同步数据
    python app.py db upgrade

    1. python app.py db init
    2. python app.py db migrate
    3. python app.py db upgrade

    基础操作

    models

    1. from datetime import datetime
    2. from exts import db
    3. class User(db.Model):
    4. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    5. username = db.Column(db.String(15), nullable=False)
    6. password = db.Column(db.String(64), nullable=False)
    7. phone = db.Column(db.String(11), unique=True)
    8. isdelete = db.Column(db.Boolean, default=False)
    9. rdatetime = db.Column(db.DateTime, default=datetime.now)
    10. def __str__(self):
    11. return self.username

    操作

    1. 1.查询:
    2. 查询所有: 模型类.query.all() ~ select * from user;
    3. 如果有条件的查询:
    4. 模型类.query.filter_by(字段名 = 值) ~ select * from user where 字段=值;
    5. 模型类.query.filter_by(字段名 = 值).first() ~ select * from user where 字段=值 limit..;
    6. select * from user where age>17 and gender='男'
    7. select * from user where username like 'zhang%';
    8. select * from user where rdatetime> xxx and rdatetime < xxx;
    9. 模型类.query.filter() 里面是布尔的条件 模型类.query.filter(模型名.字段名 == 值)
    10. 模型类.query.filter_by() 里面是一个等值 模型类.query.filter_by(字段名 = 值)
    11. ***** 模型类.query.filter() ******
    12. 1. 模型类.query.filter().all() -----> 列表
    13. 2. 模型类.query.filter().first() ----->对象
    14. 3.User.query.filter(User.username.endswith('z')).all() select * from user where username like '%z';
    15. User.query.filter(User.username.startswith('z')).all() # select * from user where username like 'z%';
    16. User.query.filter(User.username.contains('z')).all() # select * from user where username like '%z%';
    17. User.query.filter(User.username.like('z%')).all()
    18. 多条件:
    19. from sqlalchemy import or_, and_,not_
    20. 并且: and_ 获取: or_ 非: not_
    21. User.query.filter(or_(User.username.like('z%'), User.username.contains('i'))).all()
    22. 类似: select * from user where username like 'z%' or username like '%i%';
    23. User.query.filter(and_(User.username.contains('i'), User.rdatetime.__gt__('2020-05-25 10:30:00'))).all()
    24. # select * from user where username like '%i%' and rdatetime < 'xxxx'
    25. 补充:__gt__,__lt__,__ge__(gt equal),__le__ (le equal) ----》通常应用在范围(整型,日期)
    26. 也可以直接使用 > < >= <= !=
    27. User.query.filter(not_(User.username.contains('i'))).all()
    28. 18 19 20 17 21 22 ....
    29. select * from user where age in [17,18,20,22];
    30. 排序:order_by
    31. user_list = User.query.filter(User.username.contains('z')).order_by(-User.rdatetime).all() # 先筛选再排序
    32. user_list = User.query.order_by(-User.id).all() 对所有的进行排序
    33. 注意:order_by(参数):
    34. 1。 直接是字符串: '字段名' 但是不能倒序
    35. 2。 填字段名: 模型.字段 order_by(-模型.字段) 倒序
    36. 限制: limit
    37. # limit的使用 + offset
    38. # user_list = User.query.limit(2).all() 默认获取前两条
    39. user_list = User.query.offset(2).limit(2).all() 跳过2条记录再获取两条记录
    40. 总结:
    41. 1. User.query.all() 所有
    42. 2. User.query.get(pk) 一个
    43. 3. User.query.filter() * ???????
    44. 如果要检索的字段是字符串(varchar,db.String):
    45. User.username.startswith('')
    46. User.username.endswith('')
    47. User.username.contains('')
    48. User.username.like('')
    49. User.username.in_(['','',''])
    50. User.username == 'zzz'
    51. 如果要检索的字段是整型或者日期类型:
    52. User.age.__lt__(18)
    53. User.rdatetime.__gt__('.....')
    54. User.age.__le__(18)
    55. User.age.__ge__(18)
    56. User.age.between(15,30)
    57. 多个条件一起检索: and_, or_
    58. 非的条件: not_
    59. 排序:order_by()
    60. 获取指定数量: limit() offset()
    61. 4. User.query.filter_by()
    62. 删除:
    63. 两种删除:
    64. 1。逻辑删除(定义数据库中的表的时候,添加一个字段isdelete,通过此字段控制是否删除)
    65. id = request.args.get(id)
    66. user = User.query.get(id)
    67. user.isdelete = True
    68. db.session.commit()
    69. 2。物理删除(彻底从数据库中删掉)
    70. id = request.args.get(id)
    71. user = User.query.get(id)
    72. db.session.delete(user)
    73. db.session.commit()
    74. 更新:
    75. id = request.args.get(id)
    76. user = User.query.get(id)
    77. # 修改对象的属性
    78. user.username= xxxx
    79. user.phone =xxxx
    80. # 提交更改
    81. db.session.commit()
    82. # 添加
    83. user = User()
    84. user.username = username
    85. user.password = password
    86. user.phone = phone
    87. # 添加并提交
    88. db.session.add(user)
    89. db.session.commit()
    90. 两张表

    表关系

    1. from datetime import datetime
    2. from exts import db
    3. class User(db.Model):
    4. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    5. username = db.Column(db.String(15), nullable=False)
    6. password = db.Column(db.String(64), nullable=False)
    7. phone = db.Column(db.String(11), unique=True, nullable=False)
    8. email = db.Column(db.String(30))
    9. icon = db.Column(db.String(100))
    10. isdelete = db.Column(db.Boolean, default=False)
    11. rdatetime = db.Column(db.DateTime, default=datetime.now)
    12. # 增加一个字段 relationship 反向查询使用
    13. articles = db.relationship('Article', backref='user')
    14. def __str__(self):
    15. return self.username
    1. from datetime import datetime
    2. from exts import db
    3. class Article_type(db.Model):
    4. __tablename__ = 'type'
    5. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    6. type_name = db.Column(db.String(20), nullable=False)
    7. articles = db.relationship('Article', backref='articletype')
    8. class Article(db.Model):
    9. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    10. title = db.Column(db.String(50), nullable=False)
    11. content = db.Column(db.Text, nullable=False)
    12. pdatetime = db.Column(db.DateTime, default=datetime.now)
    13. click_num = db.Column(db.Integer, default=0)
    14. save_num = db.Column(db.Integer, default=0)
    15. love_num = db.Column(db.Integer, default=0)
    16. # 外键 同步到数据库的外键关系
    17. user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    18. type_id = db.Column(db.Integer, db.ForeignKey('type.id'), nullable=False)
    19. comments = db.relationship('Comment', backref='article')
    20. class Comment(db.Model):
    21. # 自定义表的名字
    22. __tablename__ = 'comment'
    23. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    24. comment = db.Column(db.String(255), nullable=False)
    25. user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    26. article_id = db.Column(db.Integer, db.ForeignKey('article.id'))
    27. cdatetime = db.Column(db.DateTime, default=datetime.now)
    28. def __str__(self):
    29. return self.comment

  • 相关阅读:
    Vue前端框架11 组件事件与v-mode配合使用、组件数据传递(父传子)、插槽Slot、具名插槽、插槽中的数据传递(双向)
    FineReport----报表模板入门
    【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter9-安装软件
    dockfile指令与构建自己的centos镜像与docker镜像历史更变信息
    设计模式—简单工厂
    Modern CSV:大型 CSV 文件编辑器/查看器 Crack
    django实现jwt身份认证
    股票价格跨度
    十沣科技船舶运动仿真 助力我国船舶研发设计提效降本
    【面试题】为什么Object.prototype.toString.call() 可以准确判断对象类型?
  • 原文地址:https://blog.csdn.net/qq_52385631/article/details/127599487