SQLAlchemyデータベースを次のid
ようなものでクエリする必要があります
User.query.filter_by(username = 'peter')
ただし、idの場合。どうすればよいですか?[グーグルとSOで検索しても役に立たなかった]
回答:
クエリには、テーブルの主キーによるクエリをサポートするget関数id
があります。
たとえば、IDが23のオブジェクトをクエリするには、次のようにします。
User.query.get(23)
注:他のいくつかのコメント投稿者と回答が言及しているように、これは単に「主キーでクエリフィルタリングを実行する」の省略形ではありません。SQLAlchemyセッションの状態に応じて、このコードを実行すると、データベースにクエリを実行して新しいインスタンスが返される場合と、実際にデータベースにクエリを実行せずに、コードの前半でクエリされたオブジェクトのインスタンスが返される場合があります。まだ読んでいない場合は、SQLAlchemyセッションのドキュメントを読んで、その影響を理解することを検討してください。
YourModel.query.get((pk1, pk2))
。タプルに注意してください。
このようにid = 1のユーザーにクエリを実行できます
session.query(User).get(1)
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',)
get()
(実際にデータベースにクエリを実行せずに)メモリ内に結果オブジェクトを提供しているように見えますが、filter().first()
は常にデータベースにクエリを実行します。
get
効率が上がるため、使用する方が適切です。
get
。そうです、より効率的です。
まず、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)