Python的SQLAlchemy框架使用入门

   这篇文章主要介绍了Python的SQLAlchemy框架使用入门,SQLAlchemy框架是Python中用来操作数据库的ORM框架之一,需要的朋友可以参考下

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

  ?

1
2
3
4
5

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

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

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

  ?

1
2
3
4
5
6
7
8
9
10

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:

  ?

1

$ easy_install sqlalchemy

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

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

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 导入:
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:

  ?

1
2
3
4

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

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

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

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

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

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

  ?

1
2
3
4
5
6
7
8
9
10

# 创建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提供的查询接口如下:

  ?

1
2
3
4
5
6
7
8
9

# 创建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()

  运行结果如下:

  ?

1
2

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

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

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

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

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

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的前提是了解关系数据库的原理。

时间: 2024-08-01 11:27:30

Python的SQLAlchemy框架使用入门的相关文章

Python的gevent框架的入门教程

  这篇文章主要介绍了Python的gevent框架的入门教程,示例代码基于Python2.x版本,需要的朋友可以参考下 Python通过yield提供了对协程的基本支持,但是不完全.而第三方的gevent为Python提供了比较完善的协程支持. gevent是第三方库,通过greenlet实现协程,其基本思想是: 当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行.由于IO操作非常耗时,经常使程序处于等待状态

Python的Django框架使用入门指引_python

 前言 传统 Web 开发方式常常需要编写繁琐乏味的重复性代码,不仅页面表现与逻辑实现的代码混杂在一起,而且代码编写效率不高.对于开发者来说,选择一个功能强大并且操作简洁的开发框架来辅助完成繁杂的编码工作,将会对开发效率的提升起到很大帮助.幸运的是,这样的开发框架并不少见,需要做的仅是从中选出恰恰为开发者量身打造的那款Web框架. 自从基于 MVC 分层结构的 Web 设计理念普及以来,选择适合的开发框架无疑是项目成功的关键性因素.无论是 Struts.Spring 或是其他 Web 框架的出现

Python的ORM框架SQLObject入门实例_python

SQLObject和SQLAlchemy都是Python语言下的ORM(对象关系映射)解决方案,其中SQLAlchemy被认为是Python下事实上的ORM标准.当然,两者都很优秀. 一.安装 复制代码 代码如下: sudo pip install SQLObject 使用SQLObject操作mysql时候报错ImportError: No module named MySQLdb,那便安装MySQLdb: 复制代码 代码如下: sudo pip install MySQL-python 没想

如何在Python的Flask框架中使用模版的入门教程

  如何在Python的Flask框架中使用模版的入门教程?          概述 如果你已经阅读过上一个章节,那么你应该已经完成了充分的准备工作并且创建了一个很简单的具有如下文件结构的Web应用: microblog |-flask文件夹 |-<一些虚拟环境的文件> |-app文件夹 | |-static文件夹 | |-templates文件夹 | |-__init__.py文件 | |-views.py文件 |-tmp文件夹 |-run.py文件 以上给你介绍了在Python的Flask

Python中编写ORM框架的入门指引

  这篇文章主要介绍了Python中编写ORM框架的入门指引,示例代码基于Python2.x版本,需要的朋友可以参考下 有了db模块,操作数据库直接写SQL就很方便.但是,我们还缺少ORM.如果有了ORM,就可以用类似这样的语句获取User对象: ? 1 user = User.get('123') 而不是写SQL然后再转换成User对象: ? 1 2 u = db.select_one('select * from users where id=?', '123') user = User(*

在Python的Flask框架中使用模版的入门教程_python

 概述 如果你已经阅读过上一个章节,那么你应该已经完成了充分的准备工作并且创建了一个很简单的具有如下文件结构的Web应用:   microblog     |-flask文件夹     |-<一些虚拟环境的文件>     |-app文件夹     |  |-static文件夹     |  |-templates文件夹     |  |-__init__.py文件     |  |-views.py文件     |-tmp文件夹     |-run.py文件 亲,想要运行这个程序么?那就运行这

在Python的Flask框架下使用sqlalchemy库的简单教程_python

flask中的sqlalchemy 相比于sqlalchemy封装的更加彻底一些 , 在一些方法上更简单 首先import类库: 在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy</span>   然后,需要加载 数据库路径 在CODE上查看代码片派生到我的代码片 <spa

Python的Tornado框架异步编程入门实例_python

Tornado Tornado 是一款非阻塞可扩展的使用Python编写的web服务器和Python Web框架, 可以使用Tornado编写Web程序并不依赖任何web服务器直接提供高效的web服务.所以Tornado不仅仅是一个web框架而且还是一款可以用于生产环境的高效的web服务器 Torando 在Linux和FreeBSD上使用高效的异步I/O模型 epoll 和kqueue来实现高效的web服务器, 所以 tornado在Linux上和FreeBSD系列性能可以达到最高接口 当然我

Python的ORM框架中SQLAlchemy库的查询操作的教程_python

1. 返回列表和标量(Scalar) 前面我们注意到Query对象可以返回可迭代的值(iterator value),然后我们可以通过for in来查询.不过Query对象的all().one()以及first()方法将返回非迭代值(non-iterator value),比如说all()返回的是一个列表: >>> query = session.query(User).\ >>> filter(User.name.like('%ed')).order_by(User.