13

私はflask-sqlalchemywebapp を構築するために使用しており、次のモデルがあります。

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True)
    candidates = db.relationship('Candidate', backref='post', lazy='dynamic')

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "<Post %r>" % self.name

class Candidate(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), primary_key=True)
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
    hostel = db.Column(db.String(80))
    yes_no = db.Column(db.Boolean)
    #votes = db.relationship('Vote', backref='vote', lazy="dynamic")

    def __init__(self, name, hostel, post_id, yes_no):
        self.name = name
        self.hostel = hostel
        self.post_id = post_id
        self.yes_no = yes_no

    def __repr__(self):
        return "<Candidate: %r, Post: %r>" % (self.name, self.post.name)

データベースの設計に関してはまったく初心者なので、いくつかの基本的なクエリについていくつかのヒントをいただければ幸いです。

  • idコラムは必要ですか?私が見たチュートリアルのほとんどは、それを列 (具体的には主キー) として持っています。なくてもいいですか?特に別の主キーがある場合はどうなりますか?

  • post_id が外部キーである場合、Candidate#Name 列と Candidate#post_id 列に複合キー制約を設定するにはどうすればよいですか。

  • データベースを「更新」するにはどうすればよいですか。モデルに変更を加えた後、それらの変更が実際のテーブルに反映されていることを確認するにはどうすればよいですか? 手動で行う必要がdrop_allありcreate_allますか?

  • 最後に、sqlalchemyドキュメントも同様に適用さflask-sqlalchemyれますか?

4

1 に答える 1

26

id 列は必要ですか? 私が見たチュートリアルのほとんどは、それを列 (具体的には主キー) として持っています。なくてもいいですか?特に別の主キーがある場合はどうなりますか?

ポストテーブルについては、はい。もう1つはいいえ。名前は一意であるため、主キーにすると主張する人もいるかもしれませんが、それはその投稿を参照する必要がある場所で名前を使用することを意味し、より多くのスペース (名前と整数の長さ) を意味します (必ずしも問題ではありません)。 「候補者の名前が変わったら?」と考えてください。ただし、確かに両方が必要なわけではありません。

post_id が外部キーである場合、Candidate#Name 列と Candidate#post_id 列に複合キー制約を設定するにはどうすればよいですか。

どのようにそれを行っているか、すべての投稿が 1 つの投稿に割り当てられます。

candidates = db.relationship('Candidate', backref='post', lazy='dynamic')

そのため、フィールドは呼び出されるべきではありませんがcandidatescandidate意味があります。

あなたの質問に答えるために、ドキュメントから引用します:

制約/インデックスで複数の列を指定するか、明示的な名前を指定するには、UniqueConstraint または Index コンストラクトを明示的に使用します。

これをモデル定義に追加する必要があります。

__table_args__ = (
        UniqueConstraint("id", "candidate_id"),
    )

ここでは役に立たないと思いますが(なぜ必要なのですか?idが一意(主キー)の場合、それを含む他の組み合わせは一意になります)...

データベースを「更新」するにはどうすればよいですか。モデルに変更を加えた後、それらの変更が実際のテーブルに反映されていることを確認するにはどうすればよいですか? drop_all と create_all を手動で行う必要がありますか?

commitデータベースに変更を加える必要があります。フラスコ-sqlalchemy のドキュメントから:

db.session.add(post)
db.session.commit()

最後に、sqlalchemy のドキュメントはフラスコ sqlalchemy にも適用されますか?

: これは、flask-sqlalchemy のソースを読んだだけで、「公式」ソースではなく、自分で見つけたものです。

はい、異なるのは、モデル、セッション、エンジンにアクセスする方法です。たとえば、sqlalchemy では次のようになります。

from sqlalchemy.orm import sessionmaker
Session = sessionmaker()
session = session()
session.commit()

そしてflask-sqlalchemyでは:

db.session.commit()

そして「モデル」の場合:

# In sqlalchemy
Base = declarative_base()
class Post(Base):
    # ...

# In flask-sqlalchemy
class Post(db.Model):
    # ...

等...

とにかく、sqlalchemy の方法で行うことは、一度実行すると、flask-sqlalchemy がバックグラウンドで実行します。

それが役立つことを願っています:)(そして、それはsqlalchemyの複合キーに関する複数の質問です...)

于 2012-06-23T11:22:45.780 に答える