私はデータベースに不慣れで、個人的なメッセージをデータベースに(SQLAlchemyを使用して)最適に保存する方法を知りたいです。
よくわからなかったので、次のPMの表を試してみました
pm_table = Table('personal_message', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('from_id', Integer, ForeignKey('user.id')),
Column('to_id', Integer, ForeignKey('user.id')),
Column('message', Text),
Column('sent_at', DateTime)
)
そしてこれがマッピングされます
session.mapper(User, user_table, properties={
'messages_sent': relation(PM, backref='sender'),
'messages_received': relation(PM, backref='receiver')
})
次のエラーメッセージが表示されます。
リレーションUser.messages_sentの親/子テーブル間の結合条件を判別できませんでした。'primaryjoin'式を指定します。これが多対多の関係である場合は、「secondaryjoin」も必要です。
これまでのところ、これは1対多の関係ですが、同じクラスに対する2つの外部キーがあります。これは正しいアプローチですかmessages_sent
、それとも2つのテーブルが必要messages_received
ですか?それとも他に何かありますか?正しい方向へのポインタをいただければ幸いです。
編集:
明確にするために、私はこれを解決するための優れたデータベース設計パターンを求めています。誰かがSQLAlchemyを手伝ってくれるなら、それは素晴らしいことですが、決して必要ではありません。
しかし、
from_id
-columnは送信者のユーザーIDになり、受信者to_id
のユーザーIDになりますか?
その通り。
コードサンプルが不完全です。
私はこの投稿で不要なコードを省略しようとしました、私は遠くまで行ったようです。欠落している定義は次のとおりです。
class PM(object):
def __init__(self, from_id, to_id, message):
self.from_id = from_id
self.to_id = to_id
self.message = message
self.sent_at = datetime.utcnow()
session.mapper(PM, pm_table)
class User(object):
def __init__(self, username, pwsalt, pwhash, email):
self.username = username
self.pwsalt = pwsalt
self.pwhash = pwhash
self.email = email
self.since = datetime.utcnow()
self.status = 0
user_table = Table('user', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('username', String(20)),
Column('pwsalt', String(32)),
Column('pwhash', String(64)),
Column('email', String(320)),
Column('since', DateTime),
Column('status', SmallInteger)
)