SQLAlchemy tutorial

重要概念

  • ORM:数据库对象 <--> class --> 类实例instance
  • 定义数据库连接
  • session:数据库事务通过session操作,flush()提交到内存但是未提交到数据库,commit()保存到数据库;

commit() flushes whatever remaining changes remain to the database, and commits the transaction. The connection resources referenced by the session are now returned to the connection pool. Subsequent operations with this session will occur in a new transaction, which will again re-acquire connection resources when first needed.

或者 What's the difference between flush() and commit()

  • The session object registers transaction operations with session.add(), but doesn't yet communicate them to the database until session.flush() is called.
  • session.flush() communicates a series of operations to the database (insert, update, delete). The database maintains them as pending operations in a transaction. The changes aren't persisted permanently to disk, or visible to other transactions until the database receives a COMMIT for the current transaction (which is what session.commit() does).
  • session.commit() commits (persists) those changes to the database.
  • flush() is always called as part of a call to commit()

定义映射

>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)
>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base = declarative_base()
>>> from sqlalchemy import Column, Integer, String
>>> class User(Base):
... __tablename__ = 'users'
... id = Column(Integer, primary_key=True)
... name = Column(String(50))
... fullname = Column(String(50))
... password = Column(String(12))
... def __repr__(self):
... return "<User(name='%s', fullname='%s', password='%s')>" % (self.nam
e, self.fullname, self.password)
...

class 定义

class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
fullname = Column(String(50))
password = Column(String(12))
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password)

创建数据库

>>> Base.metadata.create_all(engine)
2015-12-29 15:56:59,029 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2015-12-29 15:56:59,030 INFO sqlalchemy.engine.base.Engine ()
2015-12-29 15:56:59,035 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2015-12-29 15:56:59,036 INFO sqlalchemy.engine.base.Engine ()
2015-12-29 15:56:59,039 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2015-12-29 15:56:59,039 INFO sqlalchemy.engine.base.Engine ()
2015-12-29 15:56:59,042 INFO sqlalchemy.engine.base.Engine
CREATE TABLE users (
id INTEGER NOT NULL,
name VARCHAR(50),
fullname VARCHAR(50),
password VARCHAR(12),
PRIMARY KEY (id)
) 2015-12-29 15:56:59,043 INFO sqlalchemy.engine.base.Engine ()
2015-12-29 15:56:59,046 INFO sqlalchemy.engine.base.Engine COMMIT

添加数据

>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> str(ed_user.id)
'None'
>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)
>>> session = Session()
>>> session.add(ed_user)
>>> our_user = session.query(User).filter_by(name='ed').first()
2015-12-29 15:57:48,361 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-12-29 15:57:48,364 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2015-12-29 15:57:48,365 INFO sqlalchemy.engine.base.Engine ('ed', 'Ed Jones', 'edspassword')
2015-12-29 15:57:48,369 INFO sqlalchemy.engine.base.Engine
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.name = ?
LIMIT ? OFFSET ?
2015-12-29 15:57:48,371 INFO sqlalchemy.engine.base.Engine ('ed', 1, 0)
>>> our_user
<User(name='ed', fullname='Ed Jones', password='edspassword')>
>>> ed_user is our_user
True
>>> session.add_all([
... User(name='wendy', fullname='Wendy Williams', password='foobar'),
... User(name='mary', fullname='Mary Contrary', password='xxg527'),
... User(name='fred', fullname='Fred Flinstone', password='blah')])
>>> ed_user.password = 'f8s7ccs'
>>> session.dirty
IdentitySet([<User(name='ed', fullname='Ed Jones', password='f8s7ccs')>])
>>> session.new
IdentitySet([<User(name='wendy', fullname='Wendy Williams', password='foobar')>,
<User(name='fred', fullname='Fred Flinstone', password='blah')>, <User(name='ma
ry', fullname='Mary Contrary', password='xxg527')>])
>>> session.commit()
2015-12-29 16:05:12,272 INFO sqlalchemy.engine.base.Engine UPDATE users SET password=? WHERE users.id = ?
2015-12-29 16:05:12,273 INFO sqlalchemy.engine.base.Engine ('f8s7ccs', 1)
2015-12-29 16:05:12,275 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2015-12-29 16:05:12,276 INFO sqlalchemy.engine.base.Engine ('wendy', 'Wendy Williams', 'foobar')
2015-12-29 16:05:12,278 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2015-12-29 16:05:12,279 INFO sqlalchemy.engine.base.Engine ('mary', 'Mary Contrary', 'xxg527')
2015-12-29 16:05:12,280 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2015-12-29 16:05:12,282 INFO sqlalchemy.engine.base.Engine ('fred', 'Fred Flinstone', 'blah')
2015-12-29 16:05:12,285 INFO sqlalchemy.engine.base.Engine COMMIT
>>> ed_user.id
2015-12-29 16:06:27,977 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-12-29 16:06:27,980 INFO sqlalchemy.engine.base.Engine SELECT users.id AS us
ers_id, users.name AS users_name, users.fullname AS users_fullname, users.passwo
rd AS users_password
FROM users
WHERE users.id = ?
2015-12-29 16:06:27,983 INFO sqlalchemy.engine.base.Engine (1,)
1
>>> ed_user.id
1

事务回滚 Rolling Back

>>> ed_user.name = 'Edwardo'
>>> fake_user = User(name='fakeuser', fullname='Invalid', password='12345')
>>> session.add(fake_user)
>>> session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all()
2015-12-29 16:10:52,517 INFO sqlalchemy.engine.base.Engine UPDATE users SET name=? WHERE users.id = ?
2015-12-29 16:10:52,519 INFO sqlalchemy.engine.base.Engine ('Edwardo', 1)
2015-12-29 16:10:52,520 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2015-12-29 16:10:52,522 INFO sqlalchemy.engine.base.Engine ('fakeuser', 'Invalid', '12345')
2015-12-29 16:10:52,528 INFO sqlalchemy.engine.base.Engine
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.name IN (?, ?)
2015-12-29 16:10:52,529 INFO sqlalchemy.engine.base.Engine ('Edwardo', 'fakeuser')
[<User(name='Edwardo', fullname='Ed Jones', password='f8s7ccs')>, <User(name='fa
keuser', fullname='Invalid', password='12345')>]
>>> session.rollback()
2015-12-29 16:11:14,276 INFO sqlalchemy.engine.base.Engine ROLLBACK
>>> ed_user.name
2015-12-29 16:11:20,378 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-12-29 16:11:20,381 INFO sqlalchemy.engine.base.Engine
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.id = ?
2015-12-29 16:11:20,384 INFO sqlalchemy.engine.base.Engine (1,)
u'ed'
>>> fake_user in session
False
>>> session.query(User).filter(User.name.in_(['ed', 'fakeuser'])).all()
2015-12-29 16:11:35,526 INFO sqlalchemy.engine.base.Engine
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.name IN (?, ?)
2015-12-29 16:11:35,529 INFO sqlalchemy.engine.base.Engine ('ed', 'fakeuser')
[<User(name='ed', fullname='Ed Jones', password='f8s7ccs')>]

SQLAlchemy tutorial的更多相关文章

  1. SQLAlchemy指南(tutorial)

    对应版本: 0.3.4 目录 1 安装 1.1 安装SQLAlchemy 1.2 安装一个数据库API 2 快速开始 2.1 导入 2.2 连接到数据库 3 SQLAlchemy是两个库的包装 4 操 ...

  2. 使用SQLAlchemy

    使用SQLAlchemy 参考: http://www.sqlalchemy.org/ https://www.keakon.net/2012/12/03/SQLAlchemy%E4%BD%BF%E7 ...

  3. 3.SQLAlchemy文档-SQLAlchemy Core(中文版)

    这里的文描述了关于SQLAlchemy的的SQL渲染引擎的相关内容,包括数据库API的集成,事务的集成和数据架构描述服务.与以领域为中心的ORM使用模式相反,SQL表达式语言提供了一个数据构架为中心的 ...

  4. (翻译玩)SQLALchemy backref章节文档

    Linking Relationships with Backref 自从在Object Relational Tutorial中第一次提到backref参数后,许多案例中也用到了backref,那么 ...

  5. SQLAlchemy on the way

    SQLAlchemy Trial This is a great ORM ( Object-Relational Mapper ) which is compatible with  xxxx and ...

  6. Object Relational Tutorial 对象关系教程

    The SQLAlchemy Object Relational Mapper presents a method of associating user-defined Python classes ...

  7. 好用的SQLAlchemy

    准备 安装SQLAlchemy框架 测试代码 知识点剖析 引入库支持 基类和引擎 实体类 声明类 数据库自动完成 CRUD 总结 这里简单的记录一下本人第一次使用SQLAlchemy这个ORM框架的过 ...

  8. Python3+SQLAlchemy+Sqlite3实现ORM教程

    一.安装 Sqlite3是Python3标准库不需要另外安装,只需要安装SQLAlchemy即可.本文sqlalchemy版本为1.2.12 pip install sqlalchemy 二.ORM操 ...

  9. Flask使用SQLAlchemy两种方式

    一.SQLAlchemy和Alembic 主要使用原生的SQLAlchemy进行数据库操作和使用Alemic进行数据库版本控制 I 创建数据库主要有三个步骤 创建表的父类/数据库连接/Session ...

随机推荐

  1. STL编程:C++的忠告!

    Copy别人的,有少量修改,可以做为一下参考! C++之父Bjarne Stroustrup 写的 The C++ Programming Language (Special Edition) 中各章 ...

  2. Python Tutorial笔记

    Python Tutorial笔记 Python入门指南 中文版及官方英文链接: Python入门指南 (3.5.2) http://www.pythondoc.com/pythontutorial3 ...

  3. VFS文件系统结构分析 与socket

    本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,并注明原作者及原链接.内容可任意使用,但对因使用该内容引起的后果不做任何保证. 作者:fireaxe_hq@ho ...

  4. CorelDRAW 2019线上发布会报名已开始

    近日,由苏州思杰马克丁软件公司独家代理的CorelDRAW 2019将在苏州开启一场设计上的饕餮盛宴,您报名了么? 不管您是专业的设计师还是热爱设计的狂热粉丝,都将有机会参与到我们的活动中,为了这场盛 ...

  5. Python基础:使用list & tuple

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. tuple 小结 list和tuple是Python内置的有序集合,一个可变,一个不 ...

  6. React重点概要

    JSX语法: 1.ReactDOM.render:用于将模板转换为HTML语言,并插入指定的DOM节点: 语法规则:遇到 HTML 标签(以 < 开头),就用 HTML 规则解析,HTML 语言 ...

  7. ASP 读取Word文档内容简单示例_组件开发_新兴网络_20161014161610.jpg

  8. Java IO 流总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. 记Spring搭建功能完整的个人博客「Oyster」全过程[其二] Idea中Maven+SpringBoot多模块项目开发的设计和各种坑(模块间依赖和打包问题)

    大家好嘞,今天闲着没事干开写写博客,记录一下Maven+SpringBoot的多模块设计和遇到的坑. 多模块设计 简单说明一下截止目前的需求: 需要RESTful API:对文章.标签.分类和评论等的 ...

  10. 【hiho一下 第四周】Trie图

    [题目链接]:http://hihocoder.com/problemset/problem/1036?sid=1092555 [题意] [题解] AC自动机的模板题; 在求有没有子串的时候; 注意要 ...