2011-09-06 13 views
1

私はPythonでSQLAlchemyを使用して単純なDBを作成しました。入力された各ユーザーの一意のユーザーIDの列があります。新しいユーザーが追加されるたびに次のIDを提供する実行カウンタが必要です。Pythonでユーザー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) 
+1

あなたのインデントは正しくありません。あなたはそれを修正できますか? –

答えて

5

これはhttp://www.sqlalchemy.org/docs/core/schema.html#defining-sequencesです。

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

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

+0

まさに私が必要なもの!これは愚かな疑問かもしれませんが、UserとIDをシーケンスから作成すると、user_idという列を含む他のテーブル( 'accounts'、 'passwords')もあります。これはUser.idに接続されたForeignKeyなので、Userを作成すると、これらのテーブルも作成され、accounts.user_idはすぐにリンクされますか? – Chris

+0

@Chris: "ユーザーを作成すると、これらのテーブルも作成され、accounts.user_idはすぐにリンクされますか?"何があなたにそのアイデアを与えましたか? SQLAlchemyのドキュメントをお読みください。あなたの質問に対する答えは「いいえ」です。 –

0

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

私は通常、SQLAlchemyの外で自分のスキーマを作成します。あなたが望むのは、idカラムが主キーであり、nullでなく、autoincrementに設定されていることです。次に、idを割り当てないと、自動的に次のidを取得します。あなたが今、ユーザーIDが必要な場合)

0

IDがDBに新しく作成されたオブジェクトをフラッシュした後、自動的に一意の値をとりますので、私が知っているように、あなたは(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)によって提供されている対応するオブジェクト属性として割り当てるなどの単純なケースがあります。

関連する問題