Python的SQLAlchemy框架使用入门


Posted in Python onApril 29, 2015

数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表:

[
  ('1', 'Michael'),
  ('2', 'Bob'),
  ('3', 'Adam')
]

Python的DB-API返回的数据结构就是像上面这样表示的。

但是用tuple表示一行很难看出表的结构。如果把一个tuple用class实例来表示,就可以更容易地看出表的结构来:

class User(object):
  def __init__(self, id, name):
    self.id = id
    self.name = name

[
  User('1', 'Michael'),
  User('2', 'Bob'),
  User('3', 'Adam')
]

这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。是不是很简单?

但是由谁来做这个转换呢?所以ORM框架应运而生。

在Python中,最有名的ORM框架是SQLAlchemy。我们来看看SQLAlchemy的用法。

首先通过easy_install或者pip安装SQLAlchemy:

$ easy_install sqlalchemy

然后,利用上次我们在MySQL的test数据库中创建的user表,用SQLAlchemy来试试:

第一步,导入SQLAlchemy,并初始化DBSession:

# 导入:
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 创建对象的基类:
Base = declarative_base()

# 定义User对象:
class User(Base):
  # 表的名字:
  __tablename__ = 'user'

  # 表的结构:
  id = Column(String(20), primary_key=True)
  name = Column(String(20))

# 初始化数据库连接:
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)

以上代码完成SQLAlchemy的初始化和具体每个表的class定义。如果有多个表,就继续定义其他class,例如School:

class School(Base):
  __tablename__ = 'school'
  id = ...
  name = ...

create_engine()用来初始化数据库连接。SQLAlchemy用一个字符串表示连接信息:

'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'

你只需要根据需要替换掉用户名、口令等信息即可。

下面,我们看看如何向数据库表中添加一行记录。

由于有了ORM,我们向数据库表中添加一行记录,可以视为添加一个User对象:

# 创建session对象:
session = DBSession()
# 创建新User对象:
new_user = User(id='5', name='Bob')
# 添加到session:
session.add(new_user)
# 提交即保存到数据库:
session.commit()
# 关闭session:
session.close()

可见,关键是获取session,然后把对象添加到session,最后提交并关闭。Session对象可视为当前数据库连接。

如何从数据库表中查询数据呢?有了ORM,查询出来的可以不再是tuple,而是User对象。SQLAlchemy提供的查询接口如下:

# 创建Session:
session = DBSession()
# 创建Query查询,filter是where条件,最后调用one()返回唯一行,如果调用all()则返回所有行:
user = session.query(User).filter(User.id=='5').one()
# 打印类型和对象的name属性:
print 'type:', type(user)
print 'name:', user.name
# 关闭Session:
session.close()

运行结果如下:

type: <class '__main__.User'>
name: Bob

可见,ORM就是把数据库表的行与相应的对象建立关联,互相转换。

由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多、多对多等功能。

例如,如果一个User拥有多个Book,就可以定义一对多关系如下:

class User(Base):
  __tablename__ = 'user'

  id = Column(String(20), primary_key=True)
  name = Column(String(20))
  # 一对多:
  books = relationship('Book')

class Book(Base):
  __tablename__ = 'book'

  id = Column(String(20), primary_key=True)
  name = Column(String(20))
  # “多”的一方的book表是通过外键关联到user表的:
  user_id = Column(String(20), ForeignKey('user.id'))

当我们查询一个User对象时,该对象的books属性将返回一个包含若干个Book对象的list。
小结

ORM框架的作用就是把数据库表的一行记录与一个对象互相做自动转换。

正确使用ORM的前提是了解关系数据库的原理。

Python 相关文章推荐
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
在windows系统中实现python3安装lxml
Mar 23 Python
python字符串中的单双引
Feb 16 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
pyspark给dataframe增加新的一列的实现示例
Apr 24 Python
Python如何安装第三方模块
May 28 Python
Django通过json格式收集主机信息
May 29 Python
Python 字符串池化的前提
Jul 03 Python
详解pycharm自动import所需的库的操作方法
Nov 30 Python
python使用post提交数据到远程url的方法
Apr 29 #Python
python实现根据ip地址反向查找主机名称的方法
Apr 29 #Python
连接Python程序与MySQL的教程
Apr 29 #Python
python实现通过代理服务器访问远程url的方法
Apr 29 #Python
python实现带错误处理功能的远程文件读取方法
Apr 29 #Python
python使用socket远程连接错误处理方法
Apr 29 #Python
python使用socket连接远程服务器的方法
Apr 29 #Python
You might like
php 使用post,get的一种简洁方式
2010/04/25 PHP
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
对联广告js flash激活
2006/10/19 Javascript
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
js实现简单分页导航栏效果
2019/06/28 Javascript
简单的Python抓taobao图片爬虫
2014/10/26 Python
Python实现微信小程序支付功能
2019/07/25 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
Laura官网:加拿大女性的顶级时尚目的地
2019/09/20 全球购物
中医药大学市场营销专业自荐信
2013/09/29 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
李培根演讲稿
2014/05/22 职场文书
新教师培训方案
2014/06/08 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
农业项目投资意向书
2015/05/09 职场文书
篮球赛新闻稿
2015/07/17 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
考研经验交流会策划书
2015/11/02 职场文书
2019思想汇报范文
2019/05/21 职场文书