• 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

  • 相关阅读:
    网络安全笔记-WebShell与文件上传
    网络舆情危及企业经营如何应对?舆情优化十大解决方案!
    RabbitMQ整理
    webstorm 使用 live edit 调试时 加载外部资源出现CORS跨域的解决办法
    Kubernetes:更新与回滚
    软件测试之压力测试详解
    2022年安全员-C证考试模拟100题模拟考试平台操作
    Linux 中启动 SpringBoot 项目出现 java.lang.OutOfMemoryError Java heap space 错误
    《大数据之路:阿里巴巴大数据实践》-第1篇 数据技术篇 -第4章 离线数据开发
    C++ 就地构造对象
  • 原文地址:https://blog.csdn.net/qq_52385631/article/details/127599487