1

ユーザー更新機能があり、ユーザーがメールアドレスを変更できるようにしていますが、同じアドレスはデータベース内で一意である必要があるため、更新する前に、新しいメールがデータベースに既に存在するかどうかを確認する必要がありますが、確認に使用するクエリ同じ行を返します。例:

user = User.query.get(1)
user.email = 'some@email.com'

if user.validate(): # The validate function performs a query to see if 'some@email.com' is already taken
        user.save()

今私が持っている検証機能に入ります:

check = User.query.filter_by(User.email='some@email.com').first()
if check:
        # email already exists

問題は、check私が編集しているのと同じユーザーを保持していることです。Sqlalchemy は更新をデータベースに送信しますが、何らかのトランザクションの下で実行されるため、クエリは編集中の同じユーザーを返します。2 番目のセッション オブジェクトを作成することでこれを解決しましたが、やり過ぎのようです。より良いアイデアはありますか?私は理にかなっていますか?

4

2 に答える 2

1

既存のユーザーを操作する前に、特定の電子メール アドレスを持つユーザーが存在するかどうかを確認してみませんか? たとえば、そのためのスタンドアロン関数を作成できます。

def user_email_exists(email):
    return (not User.query.filter(User.email=email) == None)

user_email_exists次に、ユーザー オブジェクトを変更しようとする前に呼び出します。

...

# User object to alter
user = ...

# the new email address, which needs to be checked
new_email_addr = 'new@shiny.com' 

if user_email_exists(new_email_addr):
    raise SomeMeaningfulException() # or some `flash` message + a redirect
else:
    user.email = new_email_addr
    db.session.add(user)
    db.commit()

...
于 2011-06-27T18:22:13.617 に答える
0

おそらく最も簡単な方法は、validate 関数内のクエリに 2 つ目のフィルターを追加することです。その電子メール アドレスを持つユーザーを選択する代わりに、同じユーザー名またはユーザー ID ではなく、その電子メール アドレスを持つユーザーを選択します。そうすれば、そのメール アドレスを持つ別のユーザーがいる場合にのみ、確実に返品を受け取ることができます。

于 2011-06-28T21:54:53.043 に答える