文档章节

SQLAlchemy介绍

nanlong
 nanlong
发布于 2015/05/26 15:09
字数 1067
阅读 165
收藏 1

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

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

接下来罗列SQLAlchemy针对日常的数据库操作

文中使用的 SQLAlchemy 版本为 0.9.8

建立数据表

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()


插入数据

# 添加数据
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() 来提交这些修改。

去文档可以了解更多session相关内容:http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html

常用操作

简单查询

批量查询

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


查询单个对象

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






本文转载自:http://www.zlovezl.cn/articles/sqlalchemy-intro-for-django-guys/

共有 人打赏支持
nanlong
粉丝 3
博文 15
码字总数 2263
作品 0
朝阳
程序员
私信 提问
转-SQLAlchemy and You

written on Tuesday, July 19, 2011 from:http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/ Without doubt are most new Python web programmers these days chosing the Django frame......

玉龙
2011/07/26
0
0
Python之使用Pandas库实现MySQL数据库的读写

  本次分享将介绍如何在Python中使用Pandas库实现MySQL数据库的读写。首先我们需要了解点ORM方面的知识。 ORM技术   对象关系映射技术,即ORM(Object-Relational Mapping)技术,指的是...

jclian91
04/06
0
0
Flask中可以利用Flask-SQLAlchemy

官方文档:http://flask-sqlalchemy.pocoo.org/2.3/ 1.安装(进入虚拟环境)--利用镜像安装PyMySQL #python36 -m pip install PyMySQL -i http://pypi.mirrors.ustc.edu.cn/simple --trusted-......

编译中ing
10/04
0
0
IronPython通过pypyodbc使用SQLAlchemy的方法

SQLAlchemy是目前在Python界大热的技术,但由于IronPython数据库接口库的缺乏,IronPython却一直无法使用此神器。 现在,借助于纯Python的ODBC接口库pypyodbc,通过简单扩展SQLAlchemy,Iro...

派派技术小组
2013/03/07
0
0
[flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程

鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流。 对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文档。 一.安...

yzy121403725
05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Js中DOM事件绑定分析

在这篇文章中小编给大家整理了关于JS中DOM事件绑定的相关知识点,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 #Js事件绑定 Ja...

前端攻城小牛
13分钟前
2
0
指令、伪操作、伪指令和宏指令区别

汇编语言程序中的语句可以由指令、伪指令和宏指令组成。 指令:每一条指令都对应一种CPU操作。 伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择...

二营长意大利炮
14分钟前
2
0
SQL Server SQL语句删除索引

当删除索引提示超时时候,可以使用SQL语句删除索引,可以避免删除索引超时问题。 use [数据库名]drop index [索引名称] on [表名]

产吅经理
14分钟前
1
0
深入解析Axios 常用的请求方法别名

下面小编就为大家分享一篇Axios 常用的请求方法别名,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 #Axios 是一个基于 promise ...

前端攻城老湿
20分钟前
2
0
深入解析Vue开发动态刷新Echarts组件的教程

需求背景:dashboard作为目前企业中后台产品的“门面”,如何更加实时、高效、炫酷的对统计数据进行展示,是值得前端开发工程师和UI设计师共同思考的一个问题。今天就从0开始,封装一个动态渲...

peakedness丶
44分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部