SqlAlchemyを使用してIDでデータベースをクエリする方法は?


95

SQLAlchemyデータベースを次のidようなものでクエリする必要があります

User.query.filter_by(username = 'peter')

ただし、idの場合。どうすればよいですか?[グーグルとSOで検索しても役に立たなかった]


同等のSQLや疑似コードなど、必要なことを実行する詳細を入力してください。「SQLAlchemyデータベースID」とは何ですか?
Daniel Kluev 2011

テーブルにid列がありますか?
キース

回答:


130

クエリには、テーブルの主キーによるクエリをサポートするget関数idがあります。

たとえば、IDが23のオブジェクトをクエリするには、次のようにします。

User.query.get(23)

注:他のいくつかのコメント投稿者と回答が言及しているように、これは単に「主キーでクエリフィルタリングを実行する」の省略形ではありません。SQLAlchemyセッションの状態に応じて、このコードを実行すると、データベースにクエリを実行して新しいインスタンスが返される場合と、実際にデータベースにクエリを実行せずに、コードの前半でクエリされたオブジェクトのインスタンスが返される場合があります。まだ読んでいない場合は、SQLAlchemyセッションのドキュメントを読んで、その影響を理解することを検討してください。


8
Get関数は、複数の主キーもサポートしていますYourModel.query.get((pk1, pk2))タプルに注意してください。
marc_aragones 2018

3
このget()関数は、主キーによってオブジェクトを照会します。でクエリを実行するid場合は、id最初に主キーとして設定する必要があります。

46

このようにid = 1のユーザーにクエリを実行できます

session.query(User).get(1)


7

get()は、期待どおりでない場合があります。

トランザクションが完了した場合:

>>> session.query(User).get(1)
[SQL]: BEGIN (implicit)
[SQL]: SELECT user.id AS user_id, user.name AS user_name, user.fullname AS user_fullname
FROM user
WHERE user.id = ?
[SQL]: (1,)
<User(u'ed', u'Ed Jones')>

トランザクションを実行している場合(get()は、データベースにクエリを実行せずに、メモリ内の結果オブジェクトを提供します):

>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>

これを使用する方が良い:

>>> session.query(User.name).filter(User.id == 1).first()
[SQL]: SELECT user.name AS user_name
FROM user
WHERE user.id = ?
 LIMIT ? OFFSET ?
[SQL]: (1, 1, 0)
(u'Edwardo',)

1
この動作はどのように予期しないものですか?
ソロモンウッコ

つまり、トランザクション(まだsession.commitではない)で、get()(実際にデータベースにクエリを実行せずに)メモリ内に結果オブジェクトを提供しているように見えますが、filter().first()は常にデータベースにクエリを実行します。
panda912 2018年

トランザクション中にデータベースを同時に変更することは可能ですか?そうでない場合は、get効率が上がるため、使用する方が適切です。
ソロモンウッコ

1
私が知っているように、sqlalchemyは非同期のもの(geventでのみ表示される)では機能しませんget。そうです、より効率的です。
panda912 2018年

トランザクションに関する限り、.first()が.get()と異なるのはなぜですか?.first()は常にデータベースに戻りますか?.get()が最初に現在の環境を調べて、そのIDか何かを知っているかどうかを確認しますか?
msouth

1

使用tables reflectionする場合、与えられた解決策に問題があるかもしれません。(ここでの以前の解決策は私にはうまくいきませんでした)。

私が使用することになったのは:

session.query(object._class_).get(id)

objectデータベースからのリフレクションによって取得されたため、使用する必要があります.__class__

これがお役に立てば幸いです。


0

まず、id主キーとして設定する必要があります。
次に、このquery.get()メソッドを使用して、idすでに主キーであるオブジェクトをクエリできます。

query.get()主キーでオブジェクトをクエリするメソッド以降。Flask
から推測-SQLAlchemyドキュメント

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy()
db.init_app(app)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)

def test():
    id = 1
    user = User.query.get(id)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.