Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式
sqlalchemy 的显式 ORM 访问方式
对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作。还有一种访问方式为声明层 ORM 访问方式。
主要的建立步骤包括:
1. 设置DSN连接网址;
2. 创建引擎,利用引擎对DSN进行连接;
3. 创建元数据实例,并绑定到引擎;
4. 创建表类,并与元数据进行绑定;
5. 进行数据库操作。
基本连接关系图:

完整代码
from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.schema import Table, Column
from sqlalchemy.sql.sqltypes import Integer, VARCHAR
from sqlalchemy.orm import sessionmaker # No need to create declarative_base
# Base = declarative_base() # Set DSN
dsn = 'mysql+mysqldb://root:root@localhost/test_db' # Create engine, get connection
eng = create_engine(dsn)
cnx = eng.connect() # No need to create session
# Session = sessionmaker(bind=eng)
# session = Session() # Generate metadata instance
metadata = MetaData()
# Bind engine to metadata
metadata.bind = eng # Build up Table
test_tb = Table('test_tb', metadata,
Column('id', Integer),
Column('name', VARCHAR(8))
)
#print(type(test_tb.insert()))
# Insert value, .rowcount will return the row number affected
print(test_tb.insert().execute(id=6, name='Momo').rowcount)
# Delete value, note: '.c' attr should be added
print(test_tb.delete(test_tb.c.id==6).execute().rowcount) print(test_tb.insert().execute([{'id': 7, 'name': 'Momo'}, {'id': 8, 'name': 'Kitkat'}]).rowcount)
# Update value, change value where id is 7 to 9
print(test_tb.update(test_tb.c.id==7).execute(id=9).rowcount) print(test_tb.delete(test_tb.c.id==8).execute().rowcount)
print(test_tb.delete(test_tb.c.id==9).execute().rowcount) cnx.close()
分段分析
首先导入所需的模块,由于不需要声明层,此处进行注释
from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.schema import Table, Column
from sqlalchemy.sql.sqltypes import Integer, VARCHAR
from sqlalchemy.orm import sessionmaker # No need to create declarative_base
# Base = declarative_base()
设置DSN参数,利用该参数进行引擎实例创建并连接,再创建元数据,与引擎进行绑定,最后建立表格类,与元数据进行绑定。
# Set DSN
dsn = 'mysql+mysqldb://root:root@localhost/test_db' # Create engine, get connection
eng = create_engine(dsn)
cnx = eng.connect() # No need to create session
# Session = sessionmaker(bind=eng)
# session = Session() # Generate metadata instance
metadata = MetaData()
# Bind engine to metadata
metadata.bind = eng # Build up Table
test_tb = Table('test_tb', metadata,
Column('id', Integer),
Column('name', VARCHAR(8))
)
进行基本操作测试,注意此处删除时的条件语句在表格名和列名中间需要加入c表示列属性,最后利用连接实例关闭连接。
#print(type(test_tb.insert()))
# Insert value, .rowcount will return the row number affected
print(test_tb.insert().execute(id=6, name='Momo').rowcount)
# Delete value, note: '.c' attr should be added
print(test_tb.delete(test_tb.c.id==6).execute().rowcount) print(test_tb.insert().execute([{'id': 7, 'name': 'Momo'}, {'id': 8, 'name': 'Kitkat'}]).rowcount)
# Update value, change value where id is 7 to 9
print(test_tb.update(test_tb.c.id==7).execute(id=9).rowcount) print(test_tb.delete(test_tb.c.id==8).execute().rowcount)
print(test_tb.delete(test_tb.c.id==9).execute().rowcount) cnx.close()
相关阅读
1. 声明层 ORM 访问方式
Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式的更多相关文章
- Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块
ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...
- Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能
利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...
- Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例
sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...
- Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式
sqlalchemy的声明层ORM访问方式 sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式. 主要的建立步骤包括: ...
- Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式
建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...
- 一:ORM关系对象映射(Object Relational Mapping,简称ORM)
狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...
- django关系对象映射(Object Relational Mapping,简称ORM)
Model 创建数据库,设计表结构和字段 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 from django.db import models clas ...
- 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】
old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...
- ORM 关系对象映射 基础知识点
优点: 1.ORM使我们通用的数据库变得更加的简单便捷. 2.可避免新手程序员写sql语句带来的性能问题. 1. 创建单表 2. 创建关键表 1). 一对一 2). 一对多 3). 多对多 创建表的语 ...
随机推荐
- 使用Unity做项目的时候,一些好的建议
内容来自这个网站http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/ ,我选取了目前我看得懂的一 ...
- 剑指Offer - 九度1506 - 求1+2+3+...+n
剑指Offer - 九度1506 - 求1+2+3+...+n2013-11-29 19:22 题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switc ...
- Java中Set的contains()方法——hashCode与equals方法的约定及重写原则
转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...
- 融合模型Aggregation
从一堆弱分类器融合得到强分类器. 比如假设现在你只能水平或竖直线分割,那么无论如何都分不好,但是假设组合三次分割,就会得到如图所示的一个较好的分割线. 再比如,PLA 融合后有large margin ...
- JavaWeb笔记(五)JSP
JSP 指令 格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> 分类: page 配置JSP页面 contentType:等同于response.setCon ...
- JDK从1.8.x升级到9.0.1后Tomcat 8.0.x不能启动
目录 描述 具体环境情况 处理办法 描述 JDK在今年9月发布后,我们项目也打算测试升级使用JDK 9.在我将JDK升级成 JDK 9.0.1后,启动tomcat失败(黑框一闪就没了).具体失败信息如 ...
- hdu1007 平面最近点对(暴力+双线程优化)
突发奇想,用双线程似乎可以优化一些暴力 比如说平面最近点对这个题目,把点复制成2份 一份按照x排序,一份按照y排序 然后双线程暴力处理,一份处理x,一份处理y 如果数据利用x递减来卡,那么由于双线程, ...
- 花花的礼物 (huahua)
花花的礼物 (huahua) 花花是个爱动脑子的孩子,在她的生日的时候,她的爸爸给她准备了个礼物.但是,她的爸爸并不想让她轻易得到礼物,他把礼物放在了一个箱子里面,只有输入正确的密码才能打开箱子,而她 ...
- Codeforces Round #336 (Div. 2) A
A. Saitama Destroys Hotel time limit per test 1 second memory limit per test 256 megabytes input sta ...
- saltstack 实现redis主从
centos7.4 172.16.80.5 redis 主 172.16.80.6 redis 从 目录结构如下 file_roots: base: - /srv/salt/base dev: ...