6

SQLAlchemyで主キーなしでテーブルを作成することは可能ですか?私が定義したい関係は次のとおりです。

class TPost(Base):
  __tablename__ = "forum_post"
  id = Column(Integer, primary_key = True)
  topic_id = Column(Integer, ForeignKey("forum_topic.id"))
  index = Column(Integer)
  page = Column(Integer)
  user_id = Column(Integer, ForeignKey("forum_user.id"))
  posted_at = Column(DateTime)
  post_text = Column(String)
  has_quotes = Column(Boolean)
  quotes = relationship("TQuote")

class TQuote(Base):
  __tablename__ = "forum_quotes"
  id = Column(Integer, ForeignKey("forum_post.id"))
  is_direct = Column(Boolean)
  quoted_text = Column(String)
  quoted_id = Column(Integer)   

ご覧のとおり、主キーは実際には必要ありませんQuote。将来、関係を拡張するつもりはありません。

私の問題は具体的にはこのエラーメッセージで表されます:

sqlalchemy.exc.ArgumentError: Mapper Mapper|TQuote|forum_quotes 
could not assemble any primary key columns for mapped table 'forum_quotes'

編集: ペア(id,quoted_id)は一意であり、データの大部分に存在しますが、引用が直接ではない場合(およびその場合はquoted_idがない場合)、引用されたテキストを引用関係に直接インライン化します。デュアルテーブルアプローチ(誤った引用符に主キーを持つテーブルがある場合)を使用することもできますが、実際には、これを単一の1対多の関係として実装したいと思います。1回以上参加する必要はありません。

編集2:

引用符に番号を付け、外部キー+アプリで生成された番号をpkeyとして使用しますが、それでも面倒です。次に、構文を理解します。

編集3:

編集2で概説されているように、問題を解決しました。データを高レベルでモデル化する場合でも、関係を実装するために必要なすべての情報がSQL Alchemyにあるため、SQLalchemyにかなり悩まされます。Sql Alchemyが主キーを必要とする理由を理解しています(ormの実装が容易になります)。

なぜSQLAlchemyを使用しているのか疑問に思い始めています。それがなければ、psycopg2を使用して一方向のUPSERTまたはCREATE_IF_NOT_EXIST非同期操作を実装できます。ORMは本当に追いつく必要があります。

4

2 に答える 2

14

@TokenMacGuyが正しいと思いますが、あなたは本当に、PrimaryKeyとの概念を混乱させていsurrogate keyます。その場合、あなたの質問に対する答えは次のとおりです。

  • いいえ、SAは主キーのないテーブル(したがってテーブルとの関係)をサポートしていません
  • いいえ、として機能するために、テーブルごとに代理キーを作成する必要はありませんprimary key。一意の列の任意の組み合わせを使用してPKを定義できます。

例については、以下のコードを参照してください。

class TPost(Base):
    __tablename__ = 'forum_post'
    id = Column(Integer, primary_key = True)
    post_text = Column(String)
    quotes = relationship("TQuote", backref="post")

class TQuote(Base):
    __tablename__ = "forum_quotes"
    id = Column(Integer, ForeignKey("forum_post.id"))
    is_direct = Column(Boolean)
    quoted_text = Column(String)
    quoted_id = Column(Integer) 
    __table_args__ = (PrimaryKeyConstraint(id, quoted_id),)
于 2012-06-29T12:58:50.320 に答える
1

引用符にインデックスを付けるために列を追加してから、この新しい列の複合キーと外部キーを追加します。

于 2012-07-03T10:19:40.617 に答える