sqlalchemy 的 ORM 方式使用示例

简介:

知乎: 使用 sqlalchemy 的 orm 方式操作数据库是一种怎样的体验?

答: 酸爽!

 

本文基于:win10 + python3.4 + sqlAlchemy 1.0.13

先看一个图(来源):

这是 sqlalchemy 的层级图。不难发现,其中 orm 是最顶级的封装。

 

ORM 基本操作步骤如下:

1. 建立连接

from sqlalchemy import create_engine

engine = create_engine('sqlite:///:memory:', echo=True)

 

2. 建立会话

from sqlalchemy.orm import Session

session = Session(engine)

 

3. 声明基类

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

 

4. 定义表(继承基类)

复制代码
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship

class Parent(Base):
    __tablename__ = 'parent'
    
    id = Column(Integer, primary_key=True)
    
    children = relationship("Child")
    
    def __repr__(self):
        return "<Parent(id='{}', children='{}')>".format(self.id, self.children)

class Child(Base):
    __tablename__ = 'child'
    
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    
    def __repr__(self):
        return "<Child(id='{}', parent_id='{}')>".format(self.id, self.parent_id)
复制代码

 

5. 生成表

Base.metadata.drop_all(engine)
Base.metadata.create_all(engine) # 生产环境只需运行一次!!!!

 

6. 添加记录

session.add_all([Parent(children=[Child() for j in range(5)]) for i in range(2)])
session.commit()

 

7. 查询

复制代码
# 懒加载 (lazyload)
# load everything, no eager loading.
for parent in session.query(Parent):
    print(parent.children)

# 联合加载 (joinedload)
# load everything, joined eager loading.
for parent in session.query(Parent).options(joinedload("children")):
    parent.children

# 子查询加载 (subqueryload)
# load everything, subquery eager loading.
for parent in session.query(Parent).options(subqueryload("children")):
    parent.children
复制代码

 

8. 完整代码

复制代码
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import joinedload, subqueryload


# 建立连接
engine = create_engine('sqlite:///:memory:', echo=True)


# 建立会话
session = Session(engine)


# 声明基类
Base = declarative_base()


# 定义表(继承基类)
class Parent(Base):
    __tablename__ = 'parent'
    
    id = Column(Integer, primary_key=True)
    
    children = relationship("Child")
    
    def __repr__(self):
        return "<Parent(id='{}', children='{}')>".format(self.id, self.children)

class Child(Base):
    __tablename__ = 'child'
    
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    
    def __repr__(self):
        return "<Child(id='{}', parent_id='{}')>".format(self.id, self.parent_id)
        

# 生成表
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine) # 生产环境只需运行一次!!!!


# 添加记录
session.add_all([Parent(children=[Child() for j in range(5)]) for i in range(2)])
session.commit()


# 查询
# lazyload
# load everything, no eager loading.
for parent in session.query(Parent):
    print(parent.children)

# joinedload
# load everything, joined eager loading.
for parent in session.query(Parent).options(joinedload("children")):
    parent.children

# subqueryload
# load everything, subquery eager loading.
for parent in session.query(Parent).options(subqueryload("children")):
    parent.children
复制代码

 

本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/5513992.html ,如需转载请自行联系原作者
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
ORM基础
ORM是对象关系映射,简化数据库与数据模型的绑定,允许模型设计独立于特定数据库。在Django中使用ORM,包括三步:1) 定义模型类,如`User`,包含字段;2) 配置数据库连接,如sqlite3或mysql;3) 使用`makemigrations`和`migrate`命令创建数据库表。若需查看ORM转换的SQL,可配置日志设置。此外,可为每个应用单独配置数据库,并用`migrate --database`进行特定数据库的迁移。
ORM 字段 参数 大合集
ORM 字段 参数 大合集
|
6月前
|
SQL 存储 Go
【译】SQLAlchemy文档:SQLAlchemy 统一教程
【译】SQLAlchemy文档:SQLAlchemy 统一教程
|
数据库 Python
Django ORM F对象和Q对象查询
F对象用于操作数据库中某一列的值,它可以在没有实际访问数据库获取数据值的情况下对字段的值进行引用 使用F对象之前需要将它引入当前的环境中:
156 0
Django ORM F对象和Q对象查询
|
关系型数据库 MySQL 数据库
python的ORM技术:使用sqlalchemy操作mysql数据库
#!/usr/bin/env python # -*- coding: utf-8 -*- from sqlalchemy import Column, String, create_engine, Integer, Date, Float, ForeignKey from sqlalchemy.
1176 0
peewee模块基本使用-ORM
peewee模块基本使用-ORM
149 0
peewee模块基本使用-ORM
|
API Python
Python编程:orm之sqlalchemy模块
Python编程:orm之sqlalchemy模块
173 0
|
SQL 存储 关系型数据库
ORM映射框架总结--SQL 语句生成组件
1.       SQL 语句生成组建 之前说过ORM框架中有一个非常重要的组件,那就是SQL语句生成组件。SQL语句生成组件,顾名思义就是用于生成sql语句的一个组件。之前的Attribute 是用于修饰实体信息,而上一章讲的实体分析器分析了实体信息,在很大一部分程度上,以上做工作就是为这个SQL语句生成组件服务的。
1267 0
|
Web App开发
ORM映射框架总结--Excel 操作
  在很多时候,我们需要将查询的数据做成报表统计,然后生成Excel文档格式的。再此提供了将DataTable 数据导出excel 的方法   代码   1 /**  2  *   3  * 2009-5-2  4  *   5  *   6  * 将DataTable导出为excel文件  7  * */  8 using System;  9 using System.
907 0