Python的ORM框架SQLAlchemy入门教程


Posted in Python onApril 28, 2014

SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。

一 安装 SQLAlchemy

pip install sqlalchemy

导入如果没有报错则安装成功
>>> import sqlalchemy
>>> sqlalchemy.__version__
'0.9.1'
>>>

二 使用 sqlalchemy对数据库操作

1. 定义元信息,绑定到引擎

(env)ghost@ghost-H61M-S2V-B3:~/project/flask/fsql$ python
Python 2.7.3 (default, Apr 10 2013, 05:13:16) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from sqlalchemy import *
>>> from sqlalchemy.orm import *
>>> engine = create_engine('sqlite:///./sqlalchemy.db', echo=True)  # 定义引擎 
>>> metadata = MetaData(engine) # 绑定元信息
>>>

2.创建表格,初始化数据库

>>> users_table = Table('users', metadata,
...     Column('id', Integer, primary_key=True),
...     Column('name', String(40)),
...     Column('email', String(120)))
>>> 
>>> users_table.create()
2014-01-09 10:03:32,436 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE users (
    id INTEGER NOT NULL, 
    name VARCHAR(40), 
    email VARCHAR(120), 
    PRIMARY KEY (id)
)                                                 
2014-01-09 10:03:32,436 INFO sqlalchemy.engine.base.Engine ()
2014-01-09 10:03:32,575 INFO sqlalchemy.engine.base.Engine COMMIT
>>>

执行上述代码,我们就创建 一个 users 表,有id, name, email 三个字段

(env)ghost@ghost-H61M-S2V-B3:~/project/flask/fsql$ sqlite3 sqlalchemy.db 
SQLite version 3.7.13 2012-06-11 02:05:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
users
sqlite>

3. 基本操作,插入

如果已经table表已经存在, 第二次运行就不许要 create了,  使用 autoload 设置

>>> from sqlalchemy import *
>>> from sqlalchemy.orm import *
>>> engine = create_engine('sqlite:///./sqlalchemy.db', echo=True)
>>> metadata = MetaData(engine)
>>> users_table = Table('users', metadata, autoload=True)
2014-01-09 10:20:01,580 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2014-01-09 10:20:01,581 INFO sqlalchemy.engine.base.Engine ()
2014-01-09 10:20:01,582 INFO sqlalchemy.engine.base.Engine PRAGMA foreign_key_list("users")
2014-01-09 10:20:01,583 INFO sqlalchemy.engine.base.Engine ()
2014-01-09 10:20:01,583 INFO sqlalchemy.engine.base.Engine PRAGMA index_list("users")
2014-01-09 10:20:01,583 INFO sqlalchemy.engine.base.Engine ()
>>> users_table
Table('users', MetaData(bind=Engine(sqlite:///./sqlalchemy.db)), Column('id', INTEGER(), table=<users>, primary_key=True, nullable=False), Column('name', VARCHAR(length=40), table=<users>), Column('email', VARCHAR(length=120), table=<users>), schema=None)
>>>

实例化一个插入句柄

>>> i = users_table.insert()
>>> i
<sqlalchemy.sql.dml.Insert object at 0x31bc850>
>>> print i
INSERT INTO users (id, name, email) VALUES (?, ?, ?)
>>> i.execute(name='rsj217', email='rsj21@gmail.com')
2014-01-09 10:24:02,250 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, email) VALUES (?, ?)
2014-01-09 10:24:02,250 INFO sqlalchemy.engine.base.Engine ('rsj217', 'rsj21@gmail.com')
2014-01-09 10:24:02,251 INFO sqlalchemy.engine.base.Engine COMMIT
<sqlalchemy.engine.result.ResultProxy object at 0x31bce10>
>>> i.execute({'name': 'ghost'},{'name': 'test'})
2014-01-09 10:24:57,537 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name) VALUES (?)
2014-01-09 10:24:57,537 INFO sqlalchemy.engine.base.Engine (('ghost',), ('test',))
2014-01-09 10:24:57,537 INFO sqlalchemy.engine.base.Engine COMMIT
<sqlalchemy.engine.result.ResultProxy object at 0x31bcd50>
>>>

数据库内容为

sqlite> select * from users;
1|rsj217|rsj21@gmail.com
2|ghost|
3|test|
sqlite>

查询 删除和插入类似 都需要先实例一个 sqlalchemy.sql.dml 对象

三 使用 ORM

使用 orm 就是 将 python class 与 数据库的 table 映射,免去直接写 sql 语句

创建映射

>>> class User(object):
...     def __repr__(self):
...             return '%s(%r, %r)' % (self.__class__.__name__, self.name, self.email)
... 
>>> mapper(User, users_table)  # 创建映射
<Mapper at 0x31bcfd0; User> 
>>> ul = User()
>>> ul.name
>>> print ul
User(None, None)
>>> print ul.name
None
>>>

建立会话


查询

>>> session = create_session()
>>> session
<sqlalchemy.orm.session.Session object at 0x31bef10>
>>> query = session.query(User)
>>> query
<sqlalchemy.orm.query.Query object at 0x31bee50>
>>> u = query.filter_by(name='rsj217').first()
2014-01-09 10:44:23,809 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.email AS users_email 
FROM users 
WHERE users.name = ?
 LIMIT ? OFFSET ?
2014-01-09 10:44:23,809 INFO sqlalchemy.engine.base.Engine ('rsj217', 1, 0)
>>> u.name
u'rsj217'
>>>

插入

>>> from sqlalchemy import *
>>> from sqlalchemy.orm import *
>>> engine = create_engine('sqlite:///./sqlalchemy.db')
>>> metadata = MetaData(engine)
>>> users_table = Table('users', metadata, autoload=True)
>>> class User(object): pass
... 
>>> mapper(User, users_table)
<Mapper at 0x18185d0; User>
>>> Session = sessionmaker(bind=engine)
>>> session = Session()
>>> u = User()
>>> u.name = 'new'
>>> session.add(u)
>>> session.flush()
>>> session.commit()
>>>

注意建立会话的方式, sqlalchemy 的版本不同 sessionmaker 的方式更好

剩下删除 关系 事物等高级操作就参考官方文档了。

Python 相关文章推荐
Python计算回文数的方法
Mar 11 Python
Python创建系统目录的方法
Mar 11 Python
在Python中使用判断语句和循环的教程
Apr 25 Python
python中zip和unzip数据的方法
May 27 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
python使用turtle绘制分形树
Jun 22 Python
pandas 将索引值相加的方法
Nov 15 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
10个Python面试常问的问题(小结)
Nov 20 Python
使用pygame写一个古诗词填空通关游戏
Dec 03 Python
Python 忽略文件名编码的方法
Aug 01 Python
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 #Python
Python的ORM框架SQLObject入门实例
Apr 28 #Python
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 #Python
python监控网卡流量并使用graphite绘图的示例
Apr 27 #Python
python抓取网页图片示例(python爬虫)
Apr 27 #Python
python实现sublime3的less编译插件示例
Apr 27 #Python
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 #Python
You might like
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
stripos函数知识点实例分享
2019/02/11 PHP
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
javascript中[]和{}对象使用介绍
2013/03/20 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
解决webpack无法通过IP地址访问localhost的问题
2018/02/22 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
Python线性方程组求解运算示例
2018/01/17 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
Django框架请求生命周期实现原理
2020/11/13 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
汽车队司机先进事迹材料
2014/02/01 职场文书
法制报告会主持词
2014/04/02 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
道德与公民自我评价
2015/03/09 职场文书
创业计划书之酒厂
2019/10/14 职场文书