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 相关文章推荐
Pyramid添加Middleware的方法实例
Nov 27 Python
Python 字典dict使用介绍
Nov 30 Python
Python中的下划线详解
Jun 24 Python
选择Python写网络爬虫的优势和理由
Jul 07 Python
python实现知乎高颜值图片爬取
Aug 12 Python
pycharm不能运行.py文件的解决方法
Feb 12 Python
利用Python脚本批量生成SQL语句
Mar 04 Python
python 递归调用返回None的问题及解决方法
Mar 16 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 Python
学习Python需要哪些工具
Sep 04 Python
python使用yaml 管理selenium元素的示例
Dec 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 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
工程项目经理任命书
2014/06/05 职场文书
项目合作协议书
2014/09/23 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
酒店收银员岗位职责
2015/04/07 职场文书
2015暑假假期总结
2015/07/13 职场文书
三八妇女节致辞
2015/07/31 职场文书
分享几种python 变量合并方法
2022/03/20 Python
python处理json数据文件
2022/04/11 Python