python数据库应用Sqlalchemy和alembic介绍

概念

  • ORM
    对象关系映射(英语:Object Relational Mapping,简称ORM),是一种程序设计技术,用于实现面向对象编程语言不同类型系统的数据之间的转换,从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。我感觉比较形象的解释是“把关系数据库的表结构映射到对象上”
  • Sqlalchemy
    从ORM的概念里我们看到数据的转换,那么谁来负责转换的工作呢,所以ORM框架应运而生,在python中,最有名的ORM框架就死Sqlalchemy。Sqlalchemy是python的一款开源软件,提供了SQL工具包及对象关系映射工具。
  • alembic
    alembic是Sqlalchemy作者实现的一个数据库版本化管理工具,它可以对基于Sqlalchemy的Model与数据库之间的历史关系进行版本化的维护

Sqlalchemy使用列子

  • 安装

      $ easy_install sqlalchemy
    
  • 定义表结构并初始化数据库


class Restaurant(Base):
# 表的名字:
__tablename__ = 'restaurant'

# 表的结构:
id = id = Column(Integer, primary_key=True)
restaurant_name = Column(String(100))
restaurant_address = Column(String(300))

#数据库添加一行记录
  # 初始化数据库连接:
engine = create_engine('数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名')

# 创建对应column
# Base.metadata.create_all(engine)

# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)

# 创建session对象:
session = DBSession()
# 创建新表对象:
new_user = Restaurant(restaurant_name=‘aa’, restaurant_address=‘bb’)
# 添加到session:
session.add(new_user)
# 提交即保存到数据库:
session.commit()
#表的查询
result = session.query(Restaurant.restaurant_name, Restaurant.restaurant_address).all()
# 关闭session:
session.close() 

可以利用Base.metadata.create_all(engine)来根据表结构在数据库自动创建对应的表以及对应的结构,不需要每次运行。想了解更多sqlalchemy的功能,大家可以再扩展了解下。

alembic使用例子

  • 安装

    $ pip3 install alembic

  • 定义数据库结构
    可参考Sqlalchemy的例子定义初始的数据库结构,将脚本文件保存为models.py


import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base

Base=declarative_base()

class Person(Base):
    __tablename__='person'
    person_id = sa.Column(sa.Integer, primary_key=True)

    nickname = sa.Column(sa.String(64), nullable=False)
    password = sa.Column(sa.String(16))
    gender = sa.Column(sa.Integer)
    birthday = sa.Column(sa.Date)

class Telephone(Base):
    __tablename__='telephone'

    tel_id = sa.Column(sa.Integer, primary_key =True)
    person_id = sa.Column(sa.Integer,sa.ForeignKey('person.person_id'))
    telphone_no = sa.Column(sa.String(64))

if __name__ == "__main__":

    engine = sa.create_engine('mysql+mysqlconnector://XXX:xxxxx@ip:port/Test')
    Base.metadata.create_all(engine)
  • 初始化
    在使用之前,在项目的根目录运行初始化命令

      alembic init alembic
    

初始化完成后,你的项目目录会增加一个alembic.ini文件以及一个alembic目录。后一个alembic是个路径名称,是指版本管理的相关脚本存储的路径,可自定义。

python数据库应用Sqlalchemy和alembic介绍_第1张图片

  • 配置

首先修改一下alembic.ini文件,找到其中的sqlalchemy.url定义行,将其定义为你的数据库定义串:

sqlalchemy.url = mysql+mysqlconnector://XXX:xxxxx@ip:port/Test

修改alembic/env.py文件,找到target_metadata那一句前面添加如下语句,并修改target_metadata定义:


import os.path
import sys
sys.path.append(os.path.realpath('.'))
import models

target_metadata = models.Base.metadata
  • 修改数据库定义

realname = sa.Column(sa.String(64))
idcard = sa.Column(sa.String(20))
  • 生成升级数据库脚本

在models.py所在目录下运行

alembic revision --autogenerate -m 'added two columns to person table'

在alembic/versions目录下会生成一个30c120c761d8_added_two_columns_to_person_table.py文件,内容就是版本升级和降级需要的操作。包括 upgrade和downgrade方法。
这些语句是自动生成的,检查确认下是不是你需要的东西,根据需要稍作修改

  • 升级

在models.py所在目录下运行:

alembic upgrade head

head指的是版本号,以例子中的生成的文件,版本号是30c120c761d8。运行后会发现数据库已经对应改变了

  • 其他常用参数

更新数据库

$ alembic upgrade 版本号

更新到最新版

alembic upgrade head

降级数据库

$ alembic downgrade 版本号

更新到最初版

alembic downgrade head

离线更新(生成sql)

alembic upgrade 版本号 --sql > migration.sql

从特定起始版本生成sql

alembic upgrade 版本一:版本二 --sql > migration.sql

查询当前数据库版本号

查看alembic_version表。

清除所有版本

将versions删掉,并删除alembic_version表

你可能感兴趣的:(python)