zoukankan      html  css  js  c++  java
  • Flask使用SQLAlchemy两种方式

    一、SQLAlchemy和Alembic

    主要使用原生的SQLAlchemy进行数据库操作和使用Alemic进行数据库版本控制

    I 创建数据库主要有三个步骤

    1. 创建表的父类/数据库连接/Session   

           from sqlalchemy import Column, String, create_engine
           from sqlalchemy.ext.declarative import declarative_base
           from sqlalchemy.orm import relationship, sessionmaker
           
           BaseModel = declarative_base()
           engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
           DBSession = sessionmaker(bind=engine)        
    1. 初始化每个表的class定义

      class UserBaseModel():
          __tablename__ = 'user_elabels'
          id = Column(Integer, privatemary_key=True)
          email = Column(String(25), index = True, nullable=False)
          md5_pwd = Column(String(128), nullable=False)
      
          @property
          def password(self):
              raise AttributeError('password cat not be read')
      
          @password.setter
          def password(self, pwd):
              m2 = hashlib.md5()
              m2.update(pwd)
              self.md5_pwd = m2.hexdigest()
      
          def verify_password(self, in_pwd):
              m2 = hashlib.md5()
              m2.update(in_pwd)
              return self.md5_pwd == m2.hexdigest()
    2. 创建表以及使用 sqlalchemy可以通过寻找BaseModel的所有子类完成表的创建

      BaseModel.metadata.create_all(engine)
      # 创建session对象:
      session = DBSession()
      # 创建新User对象:
      new_user = User(...)
      # 添加到session:
      session.add(new_user)
      # 提交即保存到数据库:
      session.commit()
      # 关闭session:
      session.close()

    参考资料:

    https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014021031294178f993c85204e4d1b81ab032070641ce5000

    http://docs.sqlalchemy.org/en/latest/orm/tutorial.html

    II 使用Alembic进行数据库版本管理

    1. pip install alembic
    2. 修改alembic.ini

       改:
          sqlalchemy.url = ...
          为
          sqlalchemy.url = mysql://account:password@127.0.0.1/model_test
    3. 修改alembic/env.py

      import sys                                             
      from os.path import abspath, dirname 
      sys.path.append(dirname(dirname(abspath(__file__)))) 
      from models import BaseModel
      target_metadata = BaseModel.metadata
    4. 自动创建版本

      alembic revision --autogenerate -m "initdb"
      ###这时候会在数据库中看到所有的表已经创建
      
      #其他命令:
      
      #更新数据库:
          alembic upgrade 版本号
      #更新到最新版:
          alembic upgrade head
      #降级:
          alembic downgrade 版本号
      #降级到最初版本:
          alembic downgrade head

    流程说明:

    当我们第一次执行alembic revision --autogenerate -m "XXX"命令的时候,就会自动在数据库中创建表,此时alembic/versions/versionnumXXX.py中的upgrade()和downgrade()函数都为空。

    数据库表模型发生变动时候,执行 alembic revision --autogenerate -m "XXX" 时候,就会在alembic/versions中自动生成一个versionnoXXX.py 的文件中的upgrade()函数和downgrade()自动生成迁移脚本,此时执行

    ```
    alembic upgrade 版本号
    
    或者
    
    alemibc upgrade +1
    ```

    就会执行最新生成的versionnoXXX.py中的文件。 所以,也可以手工直接在alembic/versions下的文件中写Python代码执行升级,不过要注意版本号。

    参考资料: http://alembic.zzzcomputing.com/en/latest/tutorial.html#the-migration-environment https://segmentfault.com/a/1190000006949536

    二、使用Flask插件

    主要基于flask-sqlalchemy, flask-migrate(封装了alembic), flask-script

    from flask_sqlalchemy import SQLAlchemy
    from flask_script import Manager 
    from flask_migrate import Migrate, MigrateCommand
    basedir = os.path.abspath(os.path.dirname(file))
    
    app = Flask(name) app.config['SQLALCHEMYDATABASEURI'] =  'sqlite:///' + os.path.join(basedir, 'data.sqlite') 
    
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    db = SQLAlchemy(app) manager = Manager(app) migrate = Migrate(app, db) manager.add_command('db', MigrateCommand) 

    其中flask-sqlalchemy封装了sqlalchemy,不用导入sqlalchemy的一些类和函数,比如在上面的例子中可以通过db.Column, db.relationship直接调用而不用再次导入

    flask-alembic封装了alemibc,可以不用手工配置alembic.ini 和 alemibc/env.py 常用命令:

    创建迁移仓库:
        python main.py db init
        
    生成迁移脚本:
        python main.py db migrate -m "initial migration"
        
    执行迁移脚本:
        python main.py db upgrade

    参考资料: 基于python的web应用开发实战

  • 相关阅读:
    [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)
    [P1768]天路(分数规划+SPFA判负环)
    [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))
    [BZOJ1040][ZJOI2008]骑士(环套树dp)
    [P3759][TJOI2017]不勤劳的图书管理员(分块+树状数组)
    [CF665F]Four Divisors
    [LOJ6235]区间素数个数
    [SDOI2015]约数个数和
    [BZOJ3944]Sum
    [BZOJ2671]Calc
  • 原文地址:https://www.cnblogs.com/fcyworld/p/7693781.html
Copyright © 2011-2022 走看看