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 相关文章推荐
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
python如何修改装饰器中参数
Mar 20 Python
python 定时修改数据库的示例代码
Apr 08 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
python模拟斗地主发牌
Apr 22 Python
python怎么删除缓存文件
Jul 19 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 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
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
php学习 字符串课件
2008/06/15 PHP
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
javascript基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
2008/08/05 Javascript
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
vue实例的选项总结
2020/06/09 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
python字符串常用方法
2018/06/14 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
Python如何读写CSV文件
2020/08/13 Python
使用HTML5 Canvas API控制字体的显示与渲染的方法
2016/03/24 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
投标承诺函格式
2015/01/21 职场文书
小学教学工作总结2015
2015/05/13 职场文书
环保宣传语大全
2015/07/13 职场文书