亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

ホームページ バックエンド開発 Python チュートリアル 複數(shù)列のクエリ結(jié)果に対する SQLAlchemy オブジェクト定義の永続性

複數(shù)列のクエリ結(jié)果に対する SQLAlchemy オブジェクト定義の永続性

Oct 16, 2025 pm 11:54 PM

SQLAlchemy 多列查詢結(jié)果的對象定義保持

本文介紹了在使用 SQLAlchemy 進(jìn)行多表聯(lián)合查詢時(shí),如何保持查詢結(jié)果中每個(gè)對象的類型定義,避免類型推斷為 Any。通過使用 .tuples() 方法,可以將查詢結(jié)果轉(zhuǎn)換為元組序列,從而方便地解包并直接使用對象,無需額外定義變量類型。

在使用 SQLAlchemy 進(jìn)行數(shù)據(jù)庫查詢時(shí),經(jīng)常會(huì)遇到需要聯(lián)合多個(gè)表進(jìn)行查詢的情況。 SQLAlchemy 提供了強(qiáng)大的 select 語句來實(shí)現(xiàn)這一功能。然而,當(dāng)查詢結(jié)果包含多個(gè)對象時(shí),如何保持每個(gè)對象的類型定義,避免類型推斷為 Any,成為了一個(gè)需要解決的問題。

問題背景

假設(shè)我們有兩個(gè)模型 Item 和 Package,它們之間存在關(guān)聯(lián)關(guān)系。我們想要查詢同時(shí)包含 Item 和 Package 信息的記錄。常見的做法是使用 select 語句進(jìn)行聯(lián)合查詢:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import select

# 定義數(shù)據(jù)庫連接
engine = create_engine('sqlite:///:memory:')  # 使用內(nèi)存數(shù)據(jù)庫
Base = declarative_base()

# 定義模型
class Package(Base):
    __tablename__ = 'package'
    Package_id = Column(Integer, primary_key=True)
    name = Column(String)
    items = relationship("Item", back_populates="package")

class Item(Base):
    __tablename__ = 'item'
    Item_id = Column(Integer, primary_key=True)
    Package_id1 = Column(Integer, ForeignKey('package.Package_id'))
    description = Column(String)
    package = relationship("Package", back_populates="items")

Base.metadata.create_all(engine)

# 創(chuàng)建 Session
Session = sessionmaker(bind=engine)
session = Session()

# 插入一些數(shù)據(jù)
package1 = Package(name='Package 1')
package2 = Package(name='Package 2')
item1 = Item(description='Item 1', package=package1)
item2 = Item(description='Item 2', package=package1)
item3 = Item(description='Item 3', package=package2)

session.add_all([package1, package2, item1, item2, item3])
session.commit()

# 查詢數(shù)據(jù)
# DB = DatabaseModel() # 假設(shè) DatabaseModel 已經(jīng)定義好 session
# stmt = select(Item, Package).join(Package, Item.Package_id1 == Package.Package_id)
# exec = DB.session.execute(stmt).all() # Sequence[Row[Tuple[Item, Package]]]

# for row in exec:
#     row #Row[Tuple[Item, Package]]

#     Item_object : Item = row[0]
#     Package_object : Package = row[1]

上述代碼中,DB.session.execute(stmt).all() 返回的結(jié)果類型是 Sequence[Row[Tuple[Item, Package]]]。這意味著我們需要通過索引來訪問 Item 和 Package 對象,并且需要手動(dòng)指定類型,例如 Item_object : Item = row[0]。 這種方式雖然可行,但不夠優(yōu)雅,并且增加了代碼的冗余度。

解決方案:使用 .tuples() 方法

更簡潔、更優(yōu)雅的解決方案是使用 SQLAlchemy 的 .tuples() 方法。該方法可以將查詢結(jié)果轉(zhuǎn)換為元組序列,從而方便我們直接解包并使用對象。

stmt = select(Item, Package).join(Package, Item.Package_id1 == Package.Package_id)
exec = session.execute(stmt).tuples().all() # Sequence[Tuple[Item, Package]]]

for _item, _package in exec:
    print(f"Item Description: {_item.description}, Package Name: {_package.name}")
    # 在這里可以直接使用 _item 和 _package 對象

通過在 execute 語句后添加 .tuples(),返回的結(jié)果類型變?yōu)?Sequence[Tuple[Item, Package]]]。在 for 循環(huán)中,我們可以直接使用 _item 和 _package 來訪問 Item 和 Package 對象,而無需手動(dòng)指定類型。

示例代碼

下面是一個(gè)完整的示例代碼,演示了如何使用 .tuples() 方法進(jìn)行多表聯(lián)合查詢:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import select

# 定義數(shù)據(jù)庫連接
engine = create_engine('sqlite:///:memory:')  # 使用內(nèi)存數(shù)據(jù)庫
Base = declarative_base()

# 定義模型
class Package(Base):
    __tablename__ = 'package'
    Package_id = Column(Integer, primary_key=True)
    name = Column(String)
    items = relationship("Item", back_populates="package")

class Item(Base):
    __tablename__ = 'item'
    Item_id = Column(Integer, primary_key=True)
    Package_id1 = Column(Integer, ForeignKey('package.Package_id'))
    description = Column(String)
    package = relationship("Package", back_populates="items")

Base.metadata.create_all(engine)

# 創(chuàng)建 Session
Session = sessionmaker(bind=engine)
session = Session()

# 插入一些數(shù)據(jù)
package1 = Package(name='Package 1')
package2 = Package(name='Package 2')
item1 = Item(description='Item 1', package=package1)
item2 = Item(description='Item 2', package=package1)
item3 = Item(description='Item 3', package=package2)

session.add_all([package1, package2, item1, item2, item3])
session.commit()

# 查詢數(shù)據(jù)
stmt = select(Item, Package).join(Package, Item.Package_id1 == Package.Package_id)
exec = session.execute(stmt).tuples().all()

for _item, _package in exec:
    print(f"Item Description: {_item.description}, Package Name: {_package.name}")

注意事項(xiàng)

  • .tuples() 方法只能用于返回多個(gè)對象的查詢。如果查詢只返回一個(gè)對象,則不需要使用該方法。
  • 使用 .tuples() 方法后,查詢結(jié)果將不再是 Row 對象,而是元組。因此,不能再使用索引來訪問對象。

總結(jié)

通過使用 SQLAlchemy 的 .tuples() 方法,我們可以更方便地進(jìn)行多表聯(lián)合查詢,并保持查詢結(jié)果中每個(gè)對象的類型定義。這種方法不僅簡化了代碼,還提高了代碼的可讀性。在實(shí)際開發(fā)中,可以根據(jù)具體情況選擇合適的查詢方式,以達(dá)到最佳的效果。

以上が複數(shù)列のクエリ結(jié)果に対する SQLAlchemy オブジェクト定義の永続性の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Stock Market GPT

Stock Market GPT

AIを活用した投資調(diào)査により賢明な意思決定を?qū)g現(xiàn)

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

PEFT LORAアダプターとベースモデルの効率的なマージ戦略 PEFT LORAアダプターとベースモデルの効率的なマージ戦略 Sep 19, 2025 pm 05:12 PM

このチュートリアルは、PEFT LORAアダプターをベースモデルと効率的にマージして、完全に獨(dú)立したモデルを生成する方法を詳しく説明しています。この記事は、トランスフォーマーを直接使用することは間違っていることを指摘しています。Automodelはアダプターをロードし、重みを手動(dòng)でマージし、PEFTライブラリでMerge_and_unloadメソッドを使用する正しいプロセスを提供します。さらに、このチュートリアルでは、単語セグメントターを扱うことの重要性も強(qiáng)調(diào)し、PEFTバージョンの互換性の問題とソリューションについて説明しています。

pythonでrequastion.txtファイルからパッケージをインストールする方法 pythonでrequastion.txtファイルからパッケージをインストールする方法 Sep 18, 2025 am 04:24 AM

Pipinstall-rrequirements.txtを?qū)g行して、依存関係パッケージをインストールします。競合を回避し、ファイルパスが正しく、PIPが更新されていることを確認(rèn)し、必要に応じて-no-depsや-userなどのオプションを使用して、必要に応じてインストール動(dòng)作を調(diào)整することを確認(rèn)して、最初に仮想環(huán)境を作成およびアクティブ化することをお?jiǎng)幛幛筏蓼埂?/p>

PytestでPythonコードをテストする方法 PytestでPythonコードをテストする方法 Sep 20, 2025 am 12:35 AM

Pythonは、Pythonのシンプルで強(qiáng)力なテストツールです。インストール後、命名ルールに従ってテストファイルが自動(dòng)的に発見されます。アサーションテストのためにtest_から始まる関數(shù)を書き込み、 @pytest.fixtureを使用して再利用可能なテストデータを作成し、pytest.raisesを使用して例外を確認(rèn)し、指定されたテストと複數(shù)のコマンドラインオプションをサポートし、テスト効率を改善します。

Pythonのコマンドライン引數(shù)を処理する方法 Pythonのコマンドライン引數(shù)を処理する方法 Sep 21, 2025 am 03:49 AM

theargparsemoduleisttherecommendedwayto handlecommand-lineargumentsinpython、robustparsing、typevalidation、helpmessages、およびerrorhandling; ousesys.argvforsimplecasesrequiringminimalsetup。

Pythonの浮動(dòng)小數(shù)點(diǎn)數(shù)の精度の問題とその高精度計(jì)算スキーム Pythonの浮動(dòng)小數(shù)點(diǎn)數(shù)の精度の問題とその高精度計(jì)算スキーム Sep 19, 2025 pm 05:57 PM

この記事の目的は、PythonとNumpyの浮動(dòng)小數(shù)點(diǎn)數(shù)の計(jì)算精度が不十分であるという一般的な問題を調(diào)査し、その根本原因は標(biāo)準(zhǔn)64ビットの浮動(dòng)小數(shù)點(diǎn)數(shù)の表現(xiàn)制限にあることを説明しています。より高い精度を必要とするシナリオを計(jì)算するために、この記事では、MPMATH、Sympy、GMPYなどの高精度數(shù)學(xué)ライブラリの使用方法、機(jī)能、および適用可能なシナリオを?qū)毪筏票容^し、読者が複雑な精度のニーズを解決するための適切なツールを選択できるようにします。

PEFT LORAアダプターと基本モデルを正しくマージする方法 PEFT LORAアダプターと基本モデルを正しくマージする方法 Sep 17, 2025 pm 02:51 PM

この記事では、PEFTライブラリのMERGE_AND_UNLOAD関數(shù)を使用して、LORAアダプターを基本的な大手言語モデルに効率的かつ正確に統(tǒng)合する方法を詳しく説明します。この記事では、アダプターの読み込みとトランスを介してモデルの重みを手動(dòng)で統(tǒng)合することに関する一般的な誤解を修正し、モデルのマージ、単語セグメントター処理、潛在的なバージョン互換性の問題を解決するための専門的なガイダンスを含む完全なコード例を提供します。

Pythonの@ContextManagerデコレーターを使用してコンテキストマネージャーを作成するにはどうすればよいですか? Pythonの@ContextManagerデコレーターを使用してコンテキストマネージャーを作成するにはどうすればよいですか? Sep 20, 2025 am 04:50 AM

@ContextManagerFromContextLibandDefineAgeneratoratoraturationは、sexactlyOnceを使用します

PythonでPDFファイルを使用する方法 PythonでPDFファイルを使用する方法 Sep 20, 2025 am 04:44 AM

PYPDF2、PDFPlumber、およびFPDFは、PDFを処理するPythonのコアライブラリです。 pypdf2を使用して、pdfreaderを介してページを読み取り、extract_text()を呼び出してコンテンツを取得するなど、テキスト抽出、マージ、分割、暗號化を?qū)g行します。 PDFPlumberは、レイアウトテキストの抽出とテーブル認(rèn)識(shí)を保持するのに適しており、Extract_Tables()をサポートしてテーブルデータを正確にキャプチャします。 FPDF(推奨されるFPDF2)はPDFを生成するために使用され、ドキュメントが構(gòu)築され、add_page()、set_font()、およびcell()を介して出力されます。 PDFSをマージすると、PDFWriterのAppend()メソッドは複數(shù)のファイルを統(tǒng)合できます

See all articles