一、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应用开发实战

Flask使用SQLAlchemy两种方式的更多相关文章

  1. flask操作mongo两种方式--ORM

    #manage.py #coding=utf-8 #Flask-Script是一个可以在flask应用外部编写脚本的扩展 #常用功能: #运行一个开发的服务器 #python shell中操作数据库看 ...

  2. flask操作mongo两种方式--常规

    #manage.py #coding=utf-8 #Flask-Script是一个可以在flask应用外部编写脚本的扩展 #常用功能: #运行一个开发的服务器 #python shell中操作数据库看 ...

  3. flask 操作mysql的两种方式-sqlalchemy操作

    flask 操作mysql的两种方式-sqlalchemy操作 二.ORM sqlalchemy操作 #coding=utf-8 # model.py from app import db class ...

  4. flask 操作mysql的两种方式-sql操作

    flask 操作mysql的两种方式-sql操作 一.用常规的sql语句操作 # coding=utf-8 # model.py import MySQLdb def get_conn(): conn ...

  5. Python与数据库 sqlalchemy 建立声明层表对象的两种方式

    在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 1 from sqlalchemy.sql.schema import Table, ...

  6. Flask实战-留言板-使用Flask-DebugToolbar调试程序、Flask配置的两种组织形式

    使用Flask-DebugToolbar调试程序 扩展Flask-DebugToolbar提供了一系列调试功能,可以用来查看请求的SQL语句.配置选项.资源加载情况等信息.这些信息在开发时会非常有用. ...

  7. Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式

    建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...

  8. flask框架(二)——flask4剑客、flask配置文件的4种方式

    之前学习的Django有必备三板斧:render,HttpResponse,redirect,JsonResponse 在flask也有,但是有些不同 一.Flask4剑客 1.直接返回字符串(ret ...

  9. Struts2实现ajax的两种方式

    基于Struts2框架下实现Ajax有两种方式,第一种是原声的方式,另外一种是struts2自带的一个插件. js部分调用方式是一样的: JS代码: function testAjax() { var ...

随机推荐

  1. block循环引用

    block里边会有循环引用的风险,它可能对外部一个变量出现强引用,所以需要判断里边是否有循环引用,通过dealloc方法(销毁当前控制器.或销毁要测试的变量),判断是否循环引用.主要在block 里边 ...

  2. 【C++】面试题目:从尾到头打印链表

    通过<剑指offer 名企面试官精讲典型编程题>看到一道讲解链表的题目. 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值 链表定义如下: typedef struct _NO ...

  3. ubuntu16.04+caffe+python接口配置

    在Windows上用了一个学期的caffe了.深感各种不便,于是乎这几天在ubuntu上配置了caffe和它的python接口,现在记录配置过程,亲测可用: 环境:ubuntu16.04 , caff ...

  4. centos7版本设置OS启动默认进入图形界面还是文本界面

    相比7之前的版本,在centos7版本中,设置OS启动默认进入图形界面还是文本界面有了点变化 检查当前默认设置 [root@rems2 ~]# systemctl get-default graphi ...

  5. Win10 + Visual Studio 2017 下 OpenCV无法显示图像的问题

    测试代码如下: #include "stdafx.h" #include<opencv2\opencv.hpp> #include<opencv2\highgui ...

  6. 深入对比TOML,JSON和YAML

    坦率地说,在我开始与Hugo TOML合作之前,我感到羞耻是一个需要发现的新领域,但我对YAML和JSON非常熟悉.本文将帮助您了解如何通过不同的数据格式构建数据.       在Hugo中,您可以将 ...

  7. web前端开发分享-css,js提高篇

    一. css基础知识掌握之后(个人的标准是:弄清块元素与内联元素的区别,弄清float的应用场景,弄清position[pə'zɪʃən] 下五个属性static['stætɪk],relative[ ...

  8. 教你构建好 SpringBoot + SSM 框架

    来源:Howie_Y https://juejin.im/post/5b53f677f265da0f8f203914 目前最主流的 java web 框架应该是 SSM,而 SSM 框架由于更轻便与灵 ...

  9. python+selenium三:鼠标事件与键盘事件

    1.鼠标事件:# 每个模拟事件后需加.perform() 才会执行# context_click() 右击# double_click() 双击# drag_and_drop(source, targ ...

  10. 步步为营-36-ADO.Net简介

    与数据库进行连接交互 方法一 #region 01连接对象 //01 连接字符串 string connstr = "server=.;uid=sa;pwd=sa;database=Demo ...