Python与数据库[2] -> 关系对象映射/ORM[3] -> 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 Base = declarative_base() # Set DSN
dsn = 'mysql+mysqldb://root:root@localhost/test_db' # Create engine, get connection
eng = create_engine(dsn)
cnx = eng.connect() # Make a Session class binded with engine
Session = sessionmaker(bind=eng)
# Generate a session instance
session = Session() # Build up Table class
class Test_tb(Base):
__table__ = Table('test_tb', Base.metadata,
Column('id', Integer, primary_key=True),
Column('name', VARCHAR(8))
) # Insert value
# session.add_all([Test_tb(id=6, name='Momo')])
session.add(Test_tb(id=6, name='Momo'))
session.commit() # Delete value
session.query(Test_tb).filter(Test_tb.id==6).delete()
session.commit() session.add_all([Test_tb(id=7, name='Momo'), Test_tb(id=8, name='Kitkat')])
session.commit()
# Update value
fr = session.query(Test_tb).filter_by(id=7).all()
for f in fr:
f.id = 9
session.query(Test_tb).filter(Test_tb.id==8).delete()
session.query(Test_tb).filter(Test_tb.id==9).delete()
session.commit() re = session.query(Test_tb).all()
# Show value: Each r is a row in table
for r in re:
print(r.__dict__) 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 Base = declarative_base() # Set DSN
dsn = 'mysql+mysqldb://root:root@localhost/test_db'
创建引擎,以及会话实例
# Create engine, get connection
eng = create_engine(dsn)
cnx = eng.connect() # Make a Session class binded with engine
Session = sessionmaker(bind=eng)
# Generate a session instance
session = Session()
基于声明层创建表格类
# Build up Table class
class Test_tb(Base):
__table__ = Table('test_tb', Base.metadata,
Column('id', Integer, primary_key=True),
Column('name', VARCHAR(8))
)
最后利用会话实例对表格进行操作
# Insert value
# session.add_all([Test_tb(id=6, name='Momo')])
session.add(Test_tb(id=6, name='Momo'))
session.commit() # Delete value
session.query(Test_tb).filter(Test_tb.id==6).delete()
session.commit() session.add_all([Test_tb(id=7, name='Momo'), Test_tb(id=8, name='Kitkat')])
session.commit()
# Update value
fr = session.query(Test_tb).filter_by(id=7).all()
for f in fr:
f.id = 9
session.query(Test_tb).filter(Test_tb.id==8).delete()
session.query(Test_tb).filter(Test_tb.id==9).delete()
session.commit() re = session.query(Test_tb).all()
# Show value: Each r is a row in table
for r in re:
print(r.__dict__) cnx.close()
最终运行结果
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x000000000489F320>, 'id': 3, 'name': 'eric'}
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x000000000489F390>, 'id': 5, 'name': 'mock'}
相关阅读
1. 显式的 ORM 访问方式
Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式的更多相关文章
- Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能
利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...
- Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式
sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 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[1] -> sqlalchemy 的基本使用示例
sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...
- 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 ...
- Python与数据库 sqlalchemy 建立声明层表对象的两种方式
在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 1 from sqlalchemy.sql.schema import Table, ...
随机推荐
- 《Cracking the Coding Interview》——第7章:数学和概率论——题目1
2014-03-20 01:57 题目:玩篮球投篮,有两种玩法:要么1投1中,要么3投两中.你单次投篮中的概率是p,那么对于不同的p,哪种玩法胜率更高? 解法:第一种总是胜率更高,可以列不等式算算,结 ...
- selenium获取浏览器控制台日志
public void logsTest(){ WebDriver driver = null; try { System.setProperty("webdriver.chrome.dri ...
- ul中li元素横向排列且不换行
ul { white-space: nowrap; } li { display: inline-block; } white-space 属性设置如何处理元素内的空白. normal 默认. ...
- java IO小结
package 字符与字节转换; import java.io.*; public class char_byte { public static void main(String[] args) { ...
- php中各种操作字符串和时间戳的代码关键词
<?php/** * Created by 郭鹏. * User: msi * Date: 2017/9/27 * Time: 14:17 */ //随机数生成器echo rand();echo ...
- SpringBoot Rabbitmq发送消息
官方文档:https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#boot-features-amqp ...
- Codeforces 433 Div.2(A、B、C、D)
A. Fraction 暴力遍历1-1000,取组成的真分数比值最大且分子分母gcd为1时更新答案 代码: #include <stdio.h> #include <algorith ...
- POJ 2186 受欢迎的牛 Tarjan基础题
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> #inc ...
- 自动设置 rem es模块写法
export default function () { let html = document.documentElement; function onWindowResize() { if (ht ...
- 《R语言实战》读书笔记--第二章 创建数据集
2.1数据集的概念 变量的类型是不同的,比如标示符.日期变量.连续变量.名义变量.有序型变量等,记得数据挖掘导论中有专门的描述. R可以处理的数据类型包括了数值型.字符型.逻辑型.复数型(虚数).原生 ...