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 访问方式

2. ORM 与 sqlalchemy 模块

3. 建立声明层表对象的两种方式

Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式的更多相关文章

  1. Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能

    利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...

  2. Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式

    sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 ORM 访问方式. ...

  3. Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块

    ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...

  4. Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例

    sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...

  5. Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式

    建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...

  6. 一:ORM关系对象映射(Object Relational Mapping,简称ORM)

    狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...

  7. django关系对象映射(Object Relational Mapping,简称ORM)

    Model 创建数据库,设计表结构和字段 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 from django.db import models clas ...

  8. 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

    old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...

  9. Python与数据库 sqlalchemy 建立声明层表对象的两种方式

    在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 1 from sqlalchemy.sql.schema import Table, ...

随机推荐

  1. hasOne

    public boolean hasOne(int n) { int lastdigit=0; while( n >0 ){ lastdigit=(n % 10); if(lastdigit== ...

  2. 《Cracking the Coding Interview》——第11章:排序和搜索——题目7

    2014-03-21 22:05 题目:给你N个盒子堆成一座塔,要求下面盒子的长和宽都要严格大于上面的.问最多能堆多少个盒子? 解法1:O(n^2)的动态规划解决.其实是最长递增子序列问题,所以也可以 ...

  3. React跨域问题解决

    https://segmentfault.com/q/1010000012732581 非跨域问题报错 -rpccorsdomain="http://localhost:3000" ...

  4. vue实现数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

  5. VS2017 + EF + MySQL 我使用过程中遇到的坑

    原文:VS2017 + EF + MySQL 我使用过程中遇到的坑 写在前面: 第一次使用MySQL连接VS的时候本着最新版的应该就是最好的,在MySQL官网下载了最新版的MySQL没有并且安装完成之 ...

  6. Android中如何为自定义控件增加状态?

    在android开发中我们常常需要对控件进行相关操作,虽然网上已有很多对控件酷炫的操作,但小编今天给大家分享的纯属实用出发.在查看了一些列安卓教程和文档后,发现了一位大牛分享的非常不错的有关andro ...

  7. BZOJ 1014 [JSOI2008]火星人prefix | Splay维护哈希值

    题目: 题解: #include<cstdio> #include<algorithm> #include<cstring> typedef long long l ...

  8. 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond 解题报告

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...

  9. 0-1背包问题(经典)HDU2602 Bone Collector

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  10. Windows域同步检查repadmin

    C:\Users\>repadmin /show replUsage: repadmin <cmd> <args> [/u:{domain\user}] [/pw:{pa ...