SQLAlchemy介绍

SQLAlchemy的官网上写着它的介绍文字: html

SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives
application developers the full power and flexibility of SQL.
SQLAlchemy  是一个很是强大的ORM和数据库工具,可是它庞大的文档和复杂的功能老是让很 多人望而生畏。

接下来罗列SQLAlchemy针对平常的数据库操做 python

文中使用的 SQLAlchemy 版本为 0.9.8 mysql

创建数据表 sql

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, Date
from sqlalchemy.orm import relationship, backref

Base = declarative_base()

# 定义表结构
class GameCompany(Base):
    __tablename__ = 'game_company'

    id = Column(Integer, primary_key=True)
    name = Column(String(200), nullable=False)
    country = Column(String(50))


class Game(Base):
    __tablename__ = 'game'

    id = Column(Integer, primary_key=True)
    company_id = Column(Integer, ForeignKey('game_company.id'), index=True)
    category = Column(String(10))
    name = Column(String(200), nullable=False)
    release_date = Column(Date)

    # 和Django不一样,外键须要显式定义,具体好坏见仁见智
    # 此处的relation能够为lazy加载外键内容时提供一些可配置的选项
    company = relationship('GameCompany', backref=backref('games'))


# 此处定义要使用的数据库
engine = create_engine('mysql://root:root@localhost:5379/sqlalchemy_tutorial?charset=utf8')
# 调用create_all来建立表结构,已经存在的表将被忽略
Base.metadata.create_all(engine)


插入一些数据

接下来,咱们往表中插入一些数据 数据库

在SQLAlchemy ORM中,有一个很是关键的对象 session  ,全部对于数据的操做都是 经过session来进行的,因此要插入数据以前,咱们得先初始化一个session:
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()


插入数据 session

# 添加数据
nintendo = GameCompany(name="Nintendo", country="Japan")
capcom = GameCompany(name="Capcom", country="Japan")
game1 = Game(
    company=nintendo,
    category="ACT",
    name="Super Mario Bros",
    release_date='1985-10-18'
)
game2 = Game(
    company=capcom,
    category="ACT",
    name="Devil May Cry 3: Dante's Awakening",
    release_date="2005-03-01",
)
game3 = Game(
    company=nintendo,
    category="RPG",
    name="Mario & Luigi: Dream Team",
    release_date="2013-08-11",
)

# 使用add_all来让这些objects和session产生关系
session.add_all([nintendo, capcom, game1, game2])
# 在没有开启autocommit的模式下,不要忘了调用commit来让数据写到数据库中
session.commit()

除了commit以外,session还有rollback()等方法,你能够把session对象简单当作是一次 transaction,因此当你对内容进行修改时,须要调用 session.commit() 来提交这些修改。 app

去文档能够了解更多session相关内容:http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html 工具

经常使用操做

简单查询

批量查询 flex

session.query(Game).filter_by(category="RPG")
session.query(Game).filter(Game.category == "RPG")


查询单个对象 ui

session.query(Game).filter_by(name="Super Mario Bros").one()
# `get_objects_or_None()`
session.query(Game).filter_by(name="Super Mario Bros").scalar()


运算符重载

session.query(Game).filter(Game.release_date >= '1999-01-01').count()
# 取反使用 ~ 运算符
session.query(Game).filter(~Game.release_date >= '1999-01-01').count()


经过外键组合查询
session.query(Game).join(GameCompany).filter(GameCompany.name == "Nintendo")


多条件或查询

from sqlalchemy import or_
session.query(Game).filter(or_(Game.category == "RPG", Game.category == "ACT"))
session.query(Game).filter((Game.category == "RPG") | (Game.category == "ACT"))

in查询

session.query(Game).filter(Game.category.in_(["GAL", "ACT"]))


like查询

session.query(Game.name.contains('Mario'))


统计个数

简单统计总数

session.query(Game).filter_by(category="RPG").count()


分组统计个数

from sqlalchemy import func
session.query(Game.category, func.count(Game.category)).group_by(Game.category).all()


结果排序

对查询结果进行排序

session.query(Game).order_by(Game.release_date)
session.query(Game).order_by(Game.release_date.desc())
# 多字段排序
session.query(Game).order_by(Game.release_date.desc(), Game.category)

修改数据

game = session.query(Game).get(1)
game.name = 'Super Mario Brothers'
session.commit()


批量修改

session.query(Game).filter_by(category="RPG").update({"category": "ARPG"})


批量删除

session.query(Game).filter_by(category="ARPG").delete()


上面简单列了一些SQLAlchemy ORM的使用方法,SQLAlchemy同时还提供了一些 其余很是有用的功能。

Automap

假如你有一个Django项目,经过ORM建立了一大堆Model。这时来了一个新项目,须要操做 这些表,应该怎么办?拷贝这些Models?使用原始的DB-API加上sql来操做?

其实使用SQLAlchemy的Automap可让你的工做变得很是的方便,你只要在新项目链接到旧数据库,而后 稍微配置一下Automap,就可使用SQLAlchemy的ORM操做那些经过别的系统建立的表了。

就像这样:

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
from sqlalchemy import create_engine

Base = automap_base()
engine = create_engine("sqlite:///mydatabase.db")
Base.prepare(engine, reflect=True)

# user和address就是代表,经过这样的语句就能够把他们分别映射到User和Address类
User = Base.classes.user
Address = Base.classes.address

更多信息能够参考详细文档:http://docs.sqlalchemy.org/en/rel_0_9/orm/extensions/automap.html

Alembic

Django有south能够方便作表结构修改?SQLAlchemy固然也能够,甚至比south更为强大。 自动migrate?手动migrate?通通不是问题。

更多信息可参考文档:http://alembic.readthedocs.org/en/latest/index.html

相关文章
相关标签/搜索