首页 > 数据库 >SQLAlchemy

SQLAlchemy

时间:2024-05-14 14:54:06浏览次数:12  
标签:SQLAlchemy joinedload Column 查询 Base 关联 加载

SQLAlchemy 是一个 Python 的 ORM(对象关系映射)库,它提供了一种将关系型数据库中的表映射为 Python 对象的方式。在 SQLAlchemy 中,joinedload 和 subqueryload 是两种常用的加载策略,用于优化关联数据的加载方式。

joinedload

joinedload 是一种预先加载(eager loading)策略,它使用 JOIN 语句将相关的数据一次性加载到查询结果中。这意味着当你查询一个对象时,它的关联对象也会被同时加载,而不需要额外的查询。这可以减少数据库查询的次数,提高查询效率。

joinedload 的主要优势在于减少了数据库查询的次数,避免了 N+1 查询问题(即对于每个查询结果,都需要执行一次额外的查询来获取相关数据)。此外,使用 joinedload 还可以提高代码的可读性,因为你可以在一个查询中一次性获取所有需要的数据。

使用 joinedload 时,需要先定义好模型之间的关系,然后在查询中使用 joinedload 来指定要加载的关联表。例如,如果你有一个 User 模型和一个 Address 模型,并且它们之间存在一对多的关系,你可以使用 joinedload(User.addresses) 来在查询 User 对象时同时加载 Address 对象。

subqueryload

与 joinedload 不同,subqueryload 使用子查询的方式来加载关联数据。这意味着当你查询一个对象时,它会首先执行一个子查询来获取关联对象的 ID,然后再使用这些 ID 来加载关联对象。虽然 subqueryload 需要执行额外的查询,但它可以避免在某些情况下出现笛卡尔积的问题,从而在某些情况下可能比 joinedload 更高效。

subqueryload 适用于关联表数据量较大或关联关系较复杂的情况。在这种情况下,使用子查询可以避免一次性加载大量数据导致的性能问题。

需要注意的是,joinedload 和 subqueryload 都是预先加载策略,它们与 SQLAlchemy 的默认延迟加载(lazy loading)策略不同。延迟加载是在需要时才加载关联数据,这可能会导致额外的查询和性能问题。因此,在选择使用哪种加载策略时,需要根据实际情况进行权衡。

多对多

from sqlalchemy import Column, Integer, String, ForeignKey  
from sqlalchemy.orm import relationship  
from sqlalchemy.ext.declarative import declarative_base  
  
Base = declarative_base()  
  
class User(Base):  
    __tablename__ = 'users'  
  
    id = Column(Integer, primary_key=True)  
    name = Column(String)  
    # 其他字段...  
  
class Item(Base):  
    __tablename__ = 'items'  
  
    id = Column(Integer, primary_key=True)  
    description = Column(String)  
    # 其他字段...
	
from sqlalchemy.orm import relationship  
from sqlalchemy import Table, Column, Integer, ForeignKey  
  
# 定义关联表  
user_item_association_table = Table('user_items', Base.metadata,  
    Column('user_id', Integer, ForeignKey('users.id')),  
    Column('item_id', Integer, ForeignKey('items.id'))  
)


from sqlalchemy.orm import relationship  
  
class User(Base):  
    # ...其他字段和定义...  
    items = relationship("Item", secondary=user_item_association_table, back_populates="users")  
  
class Item(Base):  
    # ...其他字段和定义...  
    users = relationship("User", secondary=user_item_association_table, back_populates="items")

标签:SQLAlchemy,joinedload,Column,查询,Base,关联,加载
From: https://www.cnblogs.com/li-gao-wang/p/18191277

相关文章

  • db.create_all() 报错上下文?flask_sqlalchemy创建数据库找不到上下文?
    问题报错:RuntimeError:Workingoutsideofapplicationcontext.Thistypicallymeansthatyouattemptedtousefunctionalitythatneededthecurrentapplication.Tosolvethis,setupanapplicationcontextwithapp.app_context().Seethedocumentationform......
  • mysqlalchemy audit extension
    mysqlalchemyauditextensionhttps://sqlalchemy-declarative-extensions.readthedocs.io/en/stable/audit_tables.htmlfromsqlalchemyimportColumn,typesfromsqlalchemy.ormimportdeclarative_basefromsqlalchemy_declarative_extensionsimportdeclarative_......
  • 【flask sqlalchemy】A,B两个模型,A是父级模型,B是子级模型。 B创建依赖A模型的id。 如何
    fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI']='数据库连接字符串'db=SQLAlchemy(app)#定义父级模型AclassA(db.Model):id=db.Column(db.Integer,primary_key=Tr......
  • SQLAlchemy中filter()和filter_by()有什么区别
    1.filter用类名.属性名,比较用==,filter_by直接用属性名,比较用=2.filter不支持组合查询,只能连续调用filter来变相实现。session.query(Dashboard).filter(Dashboard.id.in_(dashboard_ids_int)) .all()dashboard=(db.session.query(Dashboard).filter_by(id=dashboard_......
  • SQLAlchemy 2.0 中文文档翻译完成
    SqlAlchemy2.0中文文档概述SQLAlchemyUnifiedTutorial建立连接-Engine处理事务和DBAPI处理数据库元数据处理数据使用插入语句使用SELECT语句使用UPDATE和DELETE语句使用ORM进行数据操作处理ORM相关对象进一步阅读SQLAlchemyORMORM快速入门ORM......
  • pandas读取sql文件出现:告警UserWarning: pandas only supports SQLAlchemy connectabl
    ​错误原因:导入sql的方式更新了解决方法:importpandasaspdfromsqlalchemyimportcreate_engineMYSQL_HOST='localhost'MYSQL_PORT='3306'MYSQL_USER='root'MYSQL_PASSWORD='123456'MYSQL_DB='cldk_data'engine=......
  • Flask-SQLAlchemy
    Flask-SQLAlchemyFlask-SQLAlchemy是flask的一个拓展插件,专门添加对SQLAlchemy的支持(ORM,关系对象模型)。使用它可以在flask中使用对象直接与SQLAlchemy进行交互,大大简化了SQLAlchemy与flask结合使用的过程,提供了非常方便的一些操作对象,例如引擎、模型、会话、请求等......
  • sqlalchemy relationship lazy属性
    'select' (默认):懒加载(LazyLoading):当访问与父对象关联的子对象集合或单个对象属性时,才会触发一次SQL查询,从数据库中获取相关数据。这是最常用的加载策略,因为它延迟了数据的获取,直到真正需要时才执行查询,有助于减少不必要的数据库交互。'joined':连接加载(Joi......
  • SQLAlchemy 基础知识 - autoflush 和 autocommit(转)
    原文:https://zhuanlan.zhihu.com/p/48994990作者:Cosven来源:知乎这篇文章致力于解决以下疑问(本文以MySQL为例):SQLAlchemy的session是指什么?session的autoflush参数是干什么的,我到底要不要开启它?session的autocommit参数又是什么,它和autoflush的区别是什么?SQLAl......
  • Flask python 开发篇:模型(model)Flask-SQLAlchemy的使用
    Flask-SQLAlchemy实现模型一、为什么使用模型?二、Flask-SQLAlchemy的引入三、使用Flask-SQLAlchemy构建模型文件3.1、安装扩展3.2、配置3.3、实战使用3.4、与蓝图相结合使用一、为什么使用模型?上一篇分享了蓝图的使用,也说蓝图相当于了php中控制器+路由的使用,那根......