flask框架3(數據庫ORM)

  • ORM
    • 對象關係映射,主要實現模型對象到關係數據庫數據的映射
    • 優勢:面向對象編程,對數據庫的操做都轉化成對類屬性和方法的操做,不用編寫各類數據庫的sql語句
    • 數據模型與數據庫的解耦,不在關注用的是mysql、oracle...等,經過簡單的配置就能夠輕鬆更換數據庫, 而不須要修改代碼
    • 缺點是會有性能損失
  • Flask-SQLAlchemy
    • 安裝,這裏連接mysql:
      • pip install flask-sqlalchemy
      • pip install flask-mysqldb 若是安裝報錯使用sudo apt-get install python3.5-dev
    • 配置:
      • 必要的連接配置 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://用戶名:密碼@127.0.0.1:3306/要鏈接的數據庫名'
      • 其餘配置
        • 動態追蹤修改設置,如未設置只會提示警告 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
        • 查詢時會顯示原始SQL語句 app.config['SQLALCHEMY_ECHO'] = True
  • 使用
db = SQLAlchemy(app)
class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    name = db.Column(db.String(50),nullable=False)
    age = db.Column(db.Integer)
  • 增刪查改
    • 表增刪
      • db.drop_all()
      • db.create_all()
    • 插入一條數據
      • data1 = User(name='xxx',age=11)
      • db.session.add(data1)
      • db.session.commit()
    • 插入多條
      • db.session.add_all([列表])
      • db.session.commit()
    • 查詢
      • User.query.get(1) 返回指定主鍵對應的行,如不存在,返回None
      • User.query.all() 以列表形式返回查詢的全部結果
      • User.query.first() 查詢第一個
      • User.query.count() 返回查詢結果的數量
      • User.query.filter_by(name='xxx').all() 返回名字等於xxx的全部人
      • User.query.filter(User.name=='xxx').first() 返回名字等於xxx的第一我的,使用filter必須指明熟悉來自哪一個類,且用==鏈接
      • User.query.filter(User.name.endswith('x')).all() 返回名字結尾字符爲x的全部數據 (開始startswith/包含contains)
      • User.query.filter(User.name.startswith('x'), User.age.startswith('2')).all() 查詢名字x開頭和年齡2開頭的全部人
        另一種寫法:User.query.filter(and_(User.name.startswith('x'), User.age.startswith('2'))).all()
      • 使用and_ not_ or_必需要導入 from sqlalchemy import and_,not_,or_
        • and_(1,2) 1和2兩個條件都成立
        • or_(1,2) 1或者二任一成立
        • not_() 取反
      • User.query.filter(User.id.in_([1,3,5,7,9])).all() 查詢id爲 [1, 3, 5, 7, 9] 的全部數據 包含:in_([])
      • User.query.order_by(User.age.desc()).all() 按年齡排序 desc:降序 aesc: 升序
      • 分頁:pag = User.query.paginate(2, 3) 將全部數據分頁,查詢第二頁的數據,每頁三條
      • pag.items 獲取當前頁碼的全部數據
      • pag.page 獲取當前頁碼
      • pag.pages 獲取總頁數
  • 數據庫遷移
    • 須要使用第三方包flask_script和flask_migrate from flask_script import Manager from flask_migrate import Migrate,MigrateCommand
    • 遷移代碼配置:
      • 1.配置數據庫及建立flask和數據庫對象
      • 2.建立遷移對象 migrate = Migrate(app,db) 這裏傳入flask對象和數據庫對象
      • 3.建立管理對象 manager = Manager(app) 使用flask_script的Manager管理app
      • 4.添加遷移命令到管理對象 manager.add_command('add_db',MigrateCommand) 使add_db做爲命令行的遷移命令使用
      • 5.使用manager.run()運行程序
    • 遷移步驟:
      • 1.初始化遷移操做:進入命令行,輸入python3 py文件名.py add_db init
      • 2.建立遷移腳本並記錄當前版本號:輸入python3 py文件名.py add_db migrate -m '此處輸入版本標記,註釋'
      • 3.更新數據庫,遷移確認:輸入python3 py文件名.py add_db upgrade
    • 注意只須要第一次遷移時須要初始化操做,後續若是有修改直接操做2,3步便可
    • 若是要回滾版本,可使用python3 py文件名.py add_db history命令查看歷史版本號
    • 回滾版本使用命令python3 py文件名.py add_db downgrade 版本號
相關文章
相關標籤/搜索