sqlalchemy 的 ORM 方式使用示例

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

答: 爽!

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

下面展示其操作步骤:

1. 声明基类

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

2. 定义表

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)

3. 建立连接

from sqlalchemy import create_engine

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

4. 建立会话

from sqlalchemy.orm import Session

session = Session(engine)

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.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship

from sqlalchemy import create_engine
from sqlalchemy.orm import Session

from sqlalchemy.orm import joinedload, subqueryload

# 声明基类
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)

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

# 建立会话
session = Session(engine)

# 生成表
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
时间: 2024-10-02 03:15:28

sqlalchemy 的 ORM 方式使用示例的相关文章

sqlalchemy 的 Core 方式使用示例

知乎: sqlalchemy 的 Core 方式操作数据是一种怎样的体验? 答: 爽! 本文基于:win 10 + python 3.4 + sqlalchemy 1.0.13 基本步骤如下: 1. 绑定数据库 from sqlalchemy import create_engine engine = create_engine('sqlite:///:memory:', echo=True) 2. 连接数据库 conn = engine.connect() 3. 元数据 from sqlalc

sqlalchemy 的 ORM 与 Core 混合方式使用示例

知乎: sqlalchemy 的 ORM 与 Core 混合方式操作数据库是一种怎样的体验? 答: 酸! 本文基于:win 10 + python 3.4 + sqlalchemy 1.0.13 基本步骤如下: 1. 绑定数据库 from sqlalchemy import create_engine engine = create_engine('sqlite:///:memory:',echo = True) 2. 建立会话 from sqlalchemy.orm import Sessio

java配置定时任务的几种配置方式及示例

使用java配置定时任务的几种配置方式及示例 (2010-08-21 13:16:10) 转载▼ 标签: spring 定时器 配置 it 分类: java Spring定时器,主要有两种实现方式,包括Java Timer定时和Quartz定时器! 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 package com.land; import java.util.Date;import java.util.TimerTask; public cla

sqlalchemy 的 raw sql 方式使用示例

#获取数据库 from sqlalchemy import create_engine db = create_engine("sqlite:///:memory:", echo=True) #创建表 db.execute(""" create table users( userid char(10), username char(50) )""" ) # 插入记录 resultProxy = db.execute("

使用 sqlautocode 自动生成 SQLAlchemy 的 ORM 设置脚本

日常工作中,我喜欢使用 MySQL Workbench 的数据模型工具跟踪和管理数据库的变更以及生成管理所需的文档.然而每当数据库的结构稍作变更,也需要同时修改使用SQLAlchemy 编写的 ORM 设置脚本.使用 SqlSoup 固然可以在不配置 ORM 的情况下使用 SQLAlchemy 的主要功能,但是是否能够根据现有的数据库自动生成脚本呢?上网搜索了一下,找到了这个名为 sqlautocode 的实用工具.只需在命令行中执行 sqlautocode 命令即可根据参数自动生成代码! 其调

理解sqlalchemy与ORM

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果. 使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作.根据类创建对象,对象转换成SQL,执行SQL. 1 __author__ = 'lizheng' 2 # !/usr/bi

使用sqlalchemy的ORM创建外键关联时报错

在学习使用sqlalchemy模块的时候踩了一个坑,分享一下. 埋下隐患 我先用下面的语句创建了一张学生信息表: > CREATE TABLE student ( -> id INT UNSIGNED AUTO_INCREMENT, -> name VARCHAR(20) NOT NULL, -> age TINYINT, -> PRIMARY KEY (id) -> ); 表里就3个字段:自增id(无符号的数字,自增id不会是负数,当然用无符号,感觉自己好专业),na

使用java配置定时任务的几种配置方式及示例

Spring定时器,主要有两种实现方式,包括Java Timer定时和Quartz定时器! 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 package com.land; import java.util.Date;import java.util.TimerTask; public class TimerTest extends  TimerTask  { @Override public void run() {  // TODO Auto-

我的ORM之十--示例项目

示例项目地址: code.taobao.org/svn/MyMvcApp/ 1. 编译 MyTool 2. 映射一个R盘 3. 执行 MyMvcApp\ErpCar\Res\Build_Res.bat 4. 建数据库 执行 MyMvcApp\db\合成BanChe56.bat ,并执行 MyMvcApp\db\本地数据库.bat 5. 运行: MyOql\MyOqlCache\bin\Debug\ConsoleApplication1.exe 7. 配置Web.config 数据库字符串 8.