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求crc32值的方法
Oct 05 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
浅谈Pytorch中的torch.gather函数的含义
Aug 18 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
python+Selenium自动化测试——输入,点击操作
Mar 06 Python
Python 中如何写注释
Aug 28 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
python中print格式化输出的问题
Apr 16 Python
python process模块的使用简介
May 14 Python
python树莓派通过队列实现进程交互的程序分析
Jul 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
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
Yii rules常用规则示例
2016/03/15 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
js动态引入的四种方法
2018/05/05 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
Vue watch响应数据实现方法解析
2020/07/10 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
电话客服工作职责
2014/07/27 职场文书
丽江古城导游词
2015/02/03 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
会议主持人开场白台词
2015/05/28 职场文书
Python合并pdf文件的工具
2021/07/01 Python