sqlalchemy 各种关系的写法

本文详细介绍了SQLAlchemy中不同关系型数据映射的方法,包括一对多、一对一及多对多关系的实现技巧。通过具体代码示例,阐述了ForeignKey、relationship、back_populates等关键概念的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Intro

因为 sqlalchemy 这玩意儿不是特别常用,偶然提起的时候想写个多对多关系还搜索了半天。于是趁机做个笔记。

注意事项

ForeignKey

db.ForeginKey的参数是<表名>.<键名>,而不是<类名>.<字段名>,务必注意这个区别。

back_populates 和 backref 在多对多关系中使用的区别

back_populates是更推荐的写法。

多对多关系中使用backref并指定了secondary的话,另一张表关联的relationship字段会使用相同的secondary

back_populates则需要在两张表的relationship中都写上相同的secondary中间表。

可调用的 secondary

secondary参数可以是一个可调用对象,做一些 trick 的时候应该有用。姑且记下。

一对多关系

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    child = relationship("Child", back_populates="parent")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship("Parent", back_populates="child")

parent包含多个child的一对多关系。child里写ForeignKeyparent的主键,child里写relationshipparent里同样写relationshipback_populates填充上,完事。

一对一关系

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    child = relationship("Child", uselist=False, back_populates="parent")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship("Parent", back_populates="child")

一对一关系中parent需要在relationship里加入参数uselist,其他相同,完事儿。

多对多关系

多对多关系需要一个中间表。

association_table = Table('association', Base.metadata,
    Column('left_id', Integer, ForeignKey('left.id')),
    Column('right_id', Integer, ForeignKey('right.id'))
)

class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship(
        "Child",
        secondary=association_table,
        back_populates="parents")

class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)
    parents = relationship(
        "Parent",
        secondary=association_table,
        back_populates="children")

中间表里写上parentchild的主键作为foreignkeyparentchild里的relationship加入参数secondary,指定为中间表。

转载于:https://my.oschina.net/u/3888259/blog/3016742

<think>好的,我现在需要介绍SQLAlchemy和Informix的结合使用。首先,我得确认用户想要了解什么。他们可能是在寻找如何在Informix数据库中使用SQLAlchemy进行开发的信息。 首先,我应该回顾一下SQLAlchemy的基本概念。它是一个Python的ORM工具,支持多种数据库,但需要相应的数据库驱动。Informix的驱动可能不是官方支持的,所以需要确认是否有第三方库支持,比如ibm-db或者ifxpy。 接下来,Informix数据库的特点,比如它是IBM的关系型数据库,适用于OLTP场景,支持时间序列和空间数据。这些特性可能在SQLAlchemy中有特定的配置或扩展。 然后,安装步骤。用户需要安装SQLAlchemy和Informix的驱动。例如,使用ibm-db的话,可能需要安装ibm_db_sa适配器。这里需要确保版本兼容性,避免出现问题。 配置连接字符串是关键部分。需要构造正确的URL,包括dialect、driver、用户名、密码、主机、端口、数据库名等。可能需要使用informix+ibm_db作为dialect,或者根据驱动不同有所变化。例如,如果使用ifxpy,可能dialect不同。 创建引擎时,可能会遇到依赖问题或连接错误,需要确保所有驱动正确安装,并且网络可达。此外,Informix可能有特定的连接参数,比如服务名、服务器配置等,这些需要正确设置。 定义模型时,使用SQLAlchemy的Declarative Base,创建类对应表结构。需要注意Informix的数据类型是否被SQLAlchemy完全支持,比如serial自增字段可能需要特别处理。 查询部分和普通SQLAlchemy操作类似,但要注意Informix的SQL语法可能与其它数据库不同,特别是在分页或特定函数上。例如,LIMIT和OFFSET可能需要不同的写法,或者使用Informix特有的语法,这可能需要自定义查询。 事务处理方面,Informix的隔离级别和锁机制可能有自己的特点,需要根据应用需求进行配置。SQLAlchemy的session管理在这里应该适用,但需要测试确认。 最后,资源部分,提供官方文档链接和可能的第三方适配器信息,帮助用户进一步学习。例如,ibm_db_sa的GitHub仓库或者Informix的官方文档。 需要验证一些不确定的点,比如最新的SQLAlchemy是否支持Informix,或者ibm_db_sa是否维护良好。如果有变化,可能需要调整步骤。另外,连接字符串的具体格式是否正确,可能需要查阅最新文档或示例。 总结来说,介绍SQLAlchemy和Informix的结合使用,需要涵盖驱动安装、连接配置、模型定义、查询处理以及注意事项,确保用户能够顺利开始使用,并了解潜在的问题和解决方法。</think>SQLAlchemy 是一个流行的 Python ORM(对象关系映射)工具和 SQL 工具包,支持多种数据库。Informix 是 IBM 提供的一款高性能关系型数据库,常用于 OLTP(在线事务处理)场景。结合 SQLAlchemy 和 Informix 可以实现高效的数据操作和管理。以下是详细介绍: --- ### **1. SQLAlchemy 与 Informix 的适配** - **驱动依赖**: SQLAlchemy 本身不直接提供 Informix 的官方支持,但可通过第三方驱动(如 `ibm-db` 或 `ifxpy`)实现连接。常用的是 `ibm_db_sa`(SQLAlchemy 的 IBM Data Server 适配器)。 - **安装依赖**: 需安装以下包: ```bash pip install sqlalchemy ibm-db-sa # ibm_db_sa 是 SQLAlchemy 的适配器 ``` --- ### **2. 连接 Informix 数据库** - **连接字符串格式**: 使用 `informix+ibm_db` 作为 dialect(不同驱动可能不同): ```python from sqlalchemy import create_engine # 示例连接字符串 engine = create_engine( "informix+ibm_db://user:password@host:port/database?SERVER=informix_server_name" ) ``` - `SERVER` 参数需指定 Informix 服务器名称(在 `sqlhosts` 文件中定义)。 - **关键参数说明**: - `user`/`password`:数据库账号密码。 - `host:port`:Informix 服务器地址和端口(默认 `9088`)。 - `database`:数据库名。 - `SERVER`:Informix 服务名(必须与服务器配置一致)。 --- ### **3. 定义模型与操作数据** - **创建模型**: 使用 SQLAlchemy 的 ORM 功能定义表结构: ```python from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50)) email = Column(String(120)) ``` - **创建表**: ```python Base.metadata.create_all(engine) ``` - **插入与查询数据**: ```python from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) session = Session() # 插入数据 new_user = User(name="Alice", email="alice@example.com") session.add(new_user) session.commit() # 查询数据 users = session.query(User).filter_by(name="Alice").all() ``` --- ### **4. 注意事项** - **驱动兼容性**: - 确认 `ibm_db_sa` 版本与 SQLAlchemy 兼容(部分旧版本可能存在问题)。 - 若使用 `ifxpy` 驱动,连接字符串可能需调整为 `informix+ifxpy://...`。 - **Informix 特有语法**: - Informix 的某些 SQL 语法(如分页查询 `SKIP/LIMIT`)可能需要通过 SQLAlchemy 的 `text()` 函数直接编写 SQL: ```python result = session.execute(text("SELECT * FROM users SKIP 10 LIMIT 5")) ``` - **事务与隔离级别**: Informix 默认使用游标稳定性隔离级别,可通过 SQLAlchemy 的 `execution_options` 调整。 --- ### **5. 资源与参考** - **官方文档**: - [SQLAlchemy 文档](https://www.sqlalchemy.org/) - [IBM Informix 文档](https://www.ibm.com/docs/en/informix) - **第三方驱动**: - `ibm_db_sa`:[GitHub 仓库](https://github.com/ibmdb/python-ibmdbsa) - `ifxpy`:[PyPI 页面](https://pypi.org/project/ifxpy/) --- 通过以上步骤,你可以在 Python 中利用 SQLAlchemy 高效地操作 Informix 数据库。如果在连接或语法上遇到问题,建议检查驱动配置和 SQL 语句是否符合 Informix 规范。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值