1

Python で SQLAlchemy を使用して単純な DB を作成しました。入力したユーザーごとに一意のユーザー ID の列があります。新しいユーザーが追加されるたびに次の ID を提供する実行中のカウンターが必要です。

これを実装する最良の方法は何ですか?最後のID番号の値を持つ列、またはそれは完全に別のテーブルになります(無駄に思えます)。最後のUser.idをチェックして追加する方法はありますか? ユーザー基本クラスは次のとおりです。

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key = True)
    email_address = Column(String, nullable = False)
    username = Column(String, nullable = False)
    password = Column(String, nullable = False)
    first_name = Column(String)
    full_name = Column(String)
    join_date = Column(DateTime, default=func.now()) # enters the time upon initialization

    def __init__(self, email_address, username, password):
        self.email_address = email_address
        self.username = username
        self.password = password

    def __repr__(self):
        return "<User('%s', '%s', '%s', '%s')>" % (self.email_address, self.username, self.password, self.join_date)
4

3 に答える 3

5

これを読んでください: http://www.sqlalchemy.org/docs/core/schema.html#defining-sequences .

キー生成はデータベースの一部です。

データベースに一意のキーを割り当てるだけです。

于 2011-09-06T20:14:43.870 に答える
0

id は、新しく作成されたオブジェクトを DB にフラッシュした後、自動的に一意の値を取るため、私が知っているように、今すぐユーザー ID が必要な場合は、session.flush() を実行する必要があります。

>>> user = User(email_address, username, password)
>>> print user.id
None
>>> session.add(user)
>>> session.flush()
>>> print user.id
100500

__init__また、このひどい方法を使用しないでください。カスタム ロジックまたは検証を追加する場合にのみ、カスタム init が必要です。declarative_baseただし、クラス (Base)によって既に提供されている対応するオブジェクト属性としてキーワード引数を割り当てるような単純なケース。

于 2011-09-06T21:05:50.633 に答える
0

どのデータベースを使用していますか? MySQL の場合は、既に完了している可能性があります。User.id = None のユーザーを作成してみてください。次に利用可能な ID を取る必要があります。自動インクリメントの場合、ユーザーを挿入した後、正しい ID が User.id に配置されます。

私は通常、SQLAlchemy の外でスキーマを作成します。必要なのは、id 列を null ではなく主キーにし、自動インクリメントに設定することです。次に、ID を割り当てないと、次の ID が自動的に取得されます。

于 2011-09-06T20:47:18.753 に答える