2016-06-19 4 views
2

から値を取得:SQLAlchemyの:私は<strong>フラスコSQLAlchemyの</strong>を使用して、以下の表を持っている初期化子

class Posts(db.Model):  
    id = db.Column(db.Integer, primary_key=True) 
    hashID = db.Column(db.String(6)) 
    post = db.Column(db.String(500)) 

    def __init__(self, post): 
     self.hashID = hashid.encode(self.id) 
     self.post = post 

私はautoincrementd IDフィールドを使用してハッシュを作成したいです。私は他の質問から見たdb.session.flush()しかし、私は好ましくは内部からIDを取得するので、これは動作しませんinit

self.idを使用している上記のコードは、self.idがNoneTypeを返すため動作しません。 initの内部から生成されるIDを取得する方法はありますか?ありがとう。

+0

あなたは 'self'をセッションに追加してからフラッシュすることができますが、それは良い考えではありません。オートインクリメントの代わりに、ID生成スキームを思いつくことで、アプリでDBの代わりにIDを生成することができます。 – univerio

+0

@univerioアプリ内の自動インクリメントは、より簡単な解決策のために複雑に思えます。 –

+0

私はこの問題が、あなたが 'db.Model'クラスの* \ __ init \ __ *メソッドをオーバーライドしている可能性があると思います。参照してください:http://stackoverflow.com/questions/3279833/ – wgwz

答えて

0

documentationは、そのエンティティのINSERTステートメントが発行されるまでself.id属性が設定されていないことを示します。つまり、__init__メソッドでINSERTステートメントを発行しない限り、そこで自動インクリメントされた値を取得することはできません。

私はhashid.encodeの機能を知らないが、その機能に副作用がなく、高速であれば、そのフィールドをデータベースにまったく格納する必要はありません。代わりに、あなたはpropertyでそれを追加することができます。

class Posts(...): 
    self.id = ... 
    # other columns here 

    @property 
    def hashID(self): 
     return hashid.encode(self.id) 

次にあなたが唯一のエンティティがデータベースに挿入された前にhashIDプロパティにアクセスしていないことを確認する必要があります。

注:このアプローチhashIDを作成しませありません。 hashIDをデータベースの列にする必要がある場合は、最初にオブジェクトをフラッシュしてからOPの初期コードのようにhashIDを設定します。フラッシングについては、見てくださいhere

+0

DBに永続していないようです。 –

+0

@RyanChouあなたは正しいですが、 'hashID'はDBに格納されません。この場合、冗長な情報なので、この場合は問題ありません。 – Wombatz

+0

うん。あなたの答えは、読み込み専用が必要な場合もあります。もし 'hashID'を永続させたいならば。私たちは、自動インクリメントIDに基づいてハッシュ値を生成する他の方法を試みます。 –

関連する問題