首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

需要用于SqlAlchemy单表继承的经典映射器示例

SqlAlchemy是一个Python的SQL工具和对象关系映射器(ORM),它提供了一种灵活且强大的方式来操作数据库。在SqlAlchemy中,单表继承是一种常见的数据模型设计模式,它允许我们在数据库中使用继承关系来组织数据。

经典映射器是SqlAlchemy中的一种映射方式,它使用了一个表来表示父类和子类的所有属性,通过一个特殊的列来区分不同的子类。下面是一个用于SqlAlchemy单表继承的经典映射器示例:

代码语言:python
代码运行次数:0
复制
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

class Animal(Base):
    __tablename__ = 'animals'
    id = Column(Integer, primary_key=True)
    type = Column(String(50))
    name = Column(String(50))

    __mapper_args__ = {
        'polymorphic_on': type,
        'polymorphic_identity': 'animal'
    }

class Dog(Animal):
    __tablename__ = 'dogs'
    id = Column(Integer, primary_key=True)
    breed = Column(String(50))

    __mapper_args__ = {
        'polymorphic_identity': 'dog'
    }

class Cat(Animal):
    __tablename__ = 'cats'
    id = Column(Integer, primary_key=True)
    color = Column(String(50))

    __mapper_args__ = {
        'polymorphic_identity': 'cat'
    }

在这个示例中,我们定义了一个Animal类作为父类,以及两个子类Dog和Cat。父类和子类都使用了相同的表名,但是通过type列的不同值来区分不同的子类。每个类都定义了自己的特定属性,并且通过mapper_args属性指定了对应的polymorphic_identity。

这个示例中的Animal类是一个抽象基类,不能直接实例化,而是用作其他具体子类的基类。我们可以使用SqlAlchemy的查询接口来操作这些类,例如:

代码语言:python
代码运行次数:0
复制
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///animals.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

dog = Dog(name='Buddy', breed='Labrador Retriever')
cat = Cat(name='Kitty', color='Calico')

session.add(dog)
session.add(cat)
session.commit()

animals = session.query(Animal).all()
for animal in animals:
    print(animal.name)

这段代码演示了如何创建数据库引擎、创建表格、创建会话,并向数据库中添加Dog和Cat实例。最后,我们使用查询接口查询所有的Animal实例,并打印它们的名字。

对于这个示例,腾讯云提供了一个适用于SqlAlchemy的云数据库产品,可以满足各种规模和需求的数据库存储和管理需求。具体产品信息和介绍可以参考腾讯云的云数据库 MySQL页面。

请注意,以上答案仅供参考,具体的技术选型和产品选择应根据实际需求和情况进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SqlAlchemy 2.0 中文文档(九)

加载连接继承映射 请参阅编写继承映射 SELECT 语句部分,了解关于继承加载技术背景,包括在映射器配置时间和查询时间配置要查询。## 继承 继承在单个中表示所有子类所有属性。...继承相对于联接继承具有简单性优势;查询要高效得多,因为只需要涉及一个来加载每个表示类对象。 继承配置看起来很像联接继承,除了只有基类指定了__tablename__。...请参阅编写用于继承映射 SELECT 语句和继承映射 SELECT 语句章节,了解有关继承加载技术文档,包括在映射器配置时间和查询时间配置要查询类。...加载连接继承映射 请参阅编写用于继承映射 SELECT 语句部分,了解继承加载技术背景,包括在映射器配置时间和查询时间配置要查询继承 继承将所有子类所有属性表示为单个内容。...继承相对于连接继承具有简单性优势;查询效率更高,因为只需要涉及一个来加载每个表示类对象。 继承配置看起来很像连接继承,只是基类指定了__tablename__。

25010

SqlAlchemy 2.0 中文文档(六)

继承 下面的示例说明了用于配置继承映射时使用 Mapper.polymorphic_on 和 Mapper.polymorphic_identity 参数声明级别设置: class Person...继承 下面的示例说明了用于配置继承映射时使用 Mapper.polymorphic_on 和 Mapper.polymorphic_identity 参数声明级别设置: class Person...这个方法可以用于生成继承映射层次结构中名称,就像下面的示例一样,该示例创建一个 mixin,根据类名给每个类生成一个简单名称。...这个配方可用于继承映射器层次结构生成名,如下例所示,该示例创建了一个混合类,根据类名为每个类提供一个简单名。...此示例用于继承映射器层次结构生成名,如下例所示,它创建了一个基于类名简单 mixin。

36310
  • SqlAlchemy 2.0 中文文档(四)

    使用 _orm.declared_attr() 与继承 Table 和 Mapper 参数 使用 _orm.declared_attr() 生成特定继承列 从多个混合类组合/映射器参数...嵌套复合体 复合体 API composite() 映射类继承层次结构 联接继承 与联接继承相关关系 加载联接继承映射 继承 使用 use_existing_column...解决列冲突 与继承相关关系 使用 polymorphic_abstract 构建更深层次层次结构 加载继承映射 具体表继承 具体多态加载配置 抽象具体类...经典和半经典具体多态配置 具体继承关系关系 加载具体继承映射 非传统映射 将类映射到多个 将类映射到任意子查询 一个类多个映射器 配置版本计数器...__table__ 当使用 Mapper.local_table 属性时,返回也是这个 FromClause: table = inspect(User).local_table 对于继承映射,其中类是没有自己子类

    26310

    SqlAlchemy 2.0 中文文档(十)

    如果此映射器使用继承从另一个映射器继承,则可以为 None。在使用声明式时,此参数由扩展自动传递,根据通过 DeclarativeBase....concrete – 如果为 True,则表示此映射器应使用具体表继承与其父映射器。 请参阅具体表继承示例。...polymorphic_load – 在继承层次结构中子类中指定“多态加载”行为(仅适用于连接和继承)。...参见 映射到一组显式主键列 - 背景和示例用法 version_id_col – 用于保持中行运行版本 ID Column。这用于检测并发更新或刷新中存在过时数据存在。...attribute single: bool 如果此 Mapper 是继承映射器,则表示 True。 如果设置了此标志,Mapper.local_table 将为 None。

    21710

    SqlAlchemy 2.0 中文文档(十六)

    ## 单一继承映射 SELECT 语句 单一继承设置 本节讨论继承,描述在继承中使用单个表表示层次结构中多个类。 查看本节 ORM 设置。...使用此方法将确保每个后代映射器都包含在 FROM 子句中,并允许对这些使用 filter() 条件。结果实例还将已加载这些列,因此不需要对这些列进行“后获取”。...Krabs' 要改变这种行为,对于继承,与连接继承加载中使用相同一般概念也适用于急切地加载这些额外属性,包括使用 selectin_polymorphic() 选项以及 with_polymorphic...使用这种方法将确保每个子类映射器都包含在 FROM 子句中,并允许对这些使用 filter()条件。结果实例也将已经加载了那些列,因此不需要对这些列进行“后获取”。...使用这种方法将确保每个子类映射器都包含在 FROM 子句中,并允许对这些使用 filter()条件。结果实例也将已经加载了那些列,因此不需要对这些列进行“后获取”。

    26510

    SqlAlchemy 2.0 中文文档(八十)

    在子表具有外键指向父主键联接继承配置现在可以在像 PostgreSQL 这样支持级联数据库上更新。...在子表具有外键到父主键联接继承配置中,现在可以在类似 PostgreSQL 这样支持级联数据库上进行更新。...建议使用声明性用于需要(且不喜欢)映射器之间抽象应用程序 - [/docs/05/reference/ext/declarative.html 声明性]模块用于将Table、mapper()和用户定义类对象表达结合在一起...对继承延迟加载进行了改进,现在映射器在所有情况下都会生成“优化”版本 SELECT 语句;也就是说,如果类 B 继承自 A,并且类 B 上几个属性已过期,刷新操作将只包括 B 在 SELECT...推荐为不需要(也不偏好)映射器之间抽象应用程序使用声明式 - [/docs/05/reference/ext/declarative.html 声明式] 模块,用于将 Table、mapper()

    18610

    SqlAlchemy 2.0 中文文档(七十九)

    特别是这通常适用于连接继承配置中“子”,这意味着对于大量连接对象大量插入,可以将对cursor.execute调用次数减半,从而允许本地 DBAPI 优化为那些传递给cursor.executemany...特别是在连接继承配置中通常适用于“子”,这意味着对于大量连接对象大批量插入,可以将对cursor.execute调用次数减半,从而允许本地 DBAPI 优化对传递给cursor.executemany...特别是这通常适用于连接继承配置中“子”,这意味着对于大量连接对象批量插入,可以将cursor.execute调用次数减少一半,从而允许针对那些传递给cursor.executemany()语句进行本地...,跨两个连接继承加载将从子表值填充,而不是父值。...,跨两个连接继承加载将从子表值填充,而不是父值。

    9710

    SqlAlchemy 2.0 中文文档(二十六)

    参数(Parameters): propagate=False – 当为 True 时,事件监听器应应用于所有继承映射器和/或继承映射器,以及任何作为此监听器目标的映射器。...参数: propagate=False – 当为 True 时,事件监听器应该应用于所有继承类��以及作为此监听器目标的类。...可能导致事件处理程序内“加载上下文”更改示例包括但不限于: 访问未包含在行中延迟属性将触发“取消延迟”操作并刷新对象 访问联合继承子类上不属于行属性将触发刷新操作。...参数: propagate=False – 当为 True 时,事件监听器应用于所有继承映射器和/或继承映射器,以及任何作为此监听器目标的映射器。...当将监听器应用于具有映射子类映射类时,AttributeEvents.propagate标志也很重要,例如在使用映射器继承模式时: @event.listens_for(MySuperClass.attr

    27210

    SqlAlchemy 2.0 中文文档(七十三)

    随着这种用例变得更加流行,它局限性变得明显,包括非主映射器难以配置到可选择添加新列可选项上,映射器继承原始映射关系,显式配置在非主映射器关系与加载器选项不兼容,非主映射器也没有提供可用于查询基于列属性完全功能命名空间...然而,“selectin”加载仍然依赖于在父和相关之间渲染 JOIN,因为它需要主键值在行中以匹配行。...尽管如此,根据 SQLite 自己文档中示例,JSON 名称仍然被用于其熟悉性。...随着这个用例变得越来越流行,它局限性也变得明显,包括非主要映射器难以配置以适应添加新列可选择项,映射器继承原始映射关系,明确配置在非主要映射器关系与加载器选项不兼容,非主要映射器还不能提供可在查询中使用基于列属性完全功能命名空间...随着这种使用情况越来越普遍,它局限性变得明显,包括非主映射器难以配置到可选添加新列地方,映射器继承原始映射关系,非主映射器上明确配置关系在加载器选项中表现不佳,非主映射器也不提供可以在查询中使用基于列属性完整功能命名空间

    21010

    SqlAlchemy 2.0 中文文档(三十一)

    注意 AbstractConcreteBase延迟了基类映射器创建,直到所有子类都已定义,因为它需要创建一个针对包含所有子类可选择项映射。...另请参阅 AbstractConcreteBase 具体表继承 class sqlalchemy.ext.declarative.DeferredReflection 一个用于基于延迟反射步骤构建映射辅助类...例如,使用经典元数据: from sqlalchemy import Table, Column, Integer my_data = Table('my_data', metadata,...例如,使用经典元数据: from sqlalchemy import Table, Column, Integer my_data = Table('my_data', metadata,...这是一个方便方法,会自动调用associate_with_attribute。 警告 该方法建立监听器是全局,适用于所有映射器,并且不会被垃圾回收。

    39120

    SqlAlchemy 2.0 中文文档(五)

    本节将概述可用于声明性映射器配置形式。...“声明性基类”替代方案,可以将声明性映射明确应用于类,方法是使用类似于“经典”映射命令式技术,或者更简洁地使用装饰器。...在使用继承特定情况下,也可以向映射添加额外Column对象,在这种情况下,映射子类上存在额外列,但它们没有自己Table。这在继承部分有所说明。...在使用继承特定情况下,还可以向映射添加其他Column对象,在此情况下,映射子类上存在其他列,这些列没有自己Table。这在继承部分进行了说明。...在使用继承特定情况下,还可以将其他 Column 对象添加到映射中,其中在映射子类上存在其他列,这些列没有自己 Table。这在 继承 部分有说明。

    26610

    SqlAlchemy 2.0 中文文档(十八)

    使用映射包括将存储大字符串值列,我们可能希望限制它们何时加载。 查看此页面的 ORM 设置。以下示例一些将重新定义 Book 映射器以修改某些列定义。...用于防止生成不需要 SQL。 版本 1.4 中新功能。...通常需要阻止此加载发生,并在访问属性时引发异常,表示不期望需要查询数据库以获取此列需求。典型场景是使用已知需要用于操作进行所有列加载对象,然后将其传递到视图层。...参数: key – 需要填充属性 expr – 应用于属性 SQL 表达式。...参数: key – 需要填充属性 expr – 应用于属性 SQL 表达式。 参见 将任意 SQL 表达式加载到对象上 - 背景和使用示例

    23810

    SQLAlchemy简单入门

    SQlAlchemy简单使用 sqlalchemy介绍 SQLAlchemy是PythonSQL工具包和对象关系映射器,让应用程序开发人员可以使用上SQL强大功能和灵活性。...SQLAlchemy理念 SQL数据库与对象集合目标不同,它需要关注更大数据容量与更高性能;而对象集合则和数据或数据行目标不同,它需要更好数据抽象。...SQLAlchemy设计目的,就是适配这两个原则。 SQLAlchemy把数据库当作是一个关系型代数引擎,不只是数据一个集合。...SQLAlchemy组件中最有名是它对象关系映射器(ORM),是一个提供数据映射器模式可选组件,利用这个组件,类可以以开放式多种方式映射到数据库上,允许对象模型设计和数据库架构设计,一开始就以分离方式进行各自开发...心 * 自由 不过相比DjangoORM.sqlalchemy对sql支持更好. 上面只是简单介绍了sqlalchemy增删查改,需要更加深入特性,可以查看官方文档,或者查看源码.

    2.1K100

    SqlAlchemy 2.0 中文文档(二十五)

    有关 SessionEvents.before_flush() 示例,请参见具有历史版本控制和使用时间行进行版本控制等示例。...有关SessionEvents.before_flush()示例,请参见带有历史版本控制和使用时间行进行版本控制等示例。...mappings - 一个字典序列,每个字典包含要更新映射行状态,以映射类上属性名称表示。如果映射涉及多个,比如联接继承映射,每个字典可能包含与所有对应键。...如果映射涉及多个,例如连接继承映射,每个字典可能包含与所有对应键。所有那些存在且不是主键键将应用于 UPDATE 语句 SET 子句;必需主键值将应用于 WHERE 子句。...)且尚未加载 在加载此对象查询中不存在,例如在联接继承和其他场景中常见情况。

    19110

    SqlAlchemy 2.0 中文文档(八十一)

    迄今为止 ORM 文档: www.sqlalchemy.org/docs/04/session.html#unitofwork_managing 继承 无连接或联合多态继承 继承新文档:www.sqlalchemy.org...请注意,基于属性表达式仅适用于映射类映射属性。.c 仍然用于访问常规列以及从 SQL 表达式生成可选择对象。...迄今为止 ORM 文档: www.sqlalchemy.org/docs/04/session.html#unitofwork_managing 继承 无联接或联合多态继承 继承新文档:www.sqlalchemy.org...请注意,基于属性表达式仅适用于映射类映射属性。.c仍然用于访问常规列以及从 SQL 表达式生成可选择对象。...迄今为止 ORM 文档: www.sqlalchemy.org/docs/04/session.html#unitofwork_managing 继承 无连接或联合多态继承 继承新文档:www.sqlalchemy.org

    9010

    SQLAlchemy详解

    一、SQLAlchemy介绍   SQLAlchemy 是 Python SQL 工具包和对象关系映射器,为应用程序开发人员提供 SQL 全部功能和灵活性。   ...因为SQLAlchemy不能直接操作数据库,还需要python中pymysql第三方库,所以还需要安装pymysql   PyMySQL==1.1.0....三、创建测试数据库   创建一个用于测试数据库   其中sqlalchemydb就是测试数据库 四、封装SQLAlchemyDB类   在python项目根目录下创建一个sqlalchemy_db.py...() 会将我们模型自动映射到数据库中,当然也可以手动去数据库中创建     说明3:我们写好这个model类暂时还没有使用呢 。...test.py运行该脚本,就会发现我们model模型,已经同步到数据库中了 七、添加测试数据   7.1 条添加数据     修改test.py文件如下,然后python test.py执行

    1.2K10
    领券