我是数据库新手,想知道如何最好地将个人消息存储在数据库中(使用 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”表达式。如果这是多对多关系,则还需要“辅助连接”。
据我目前了解,这是一对多的关系,但同一个类有两个外键。这甚至是正确的方法还是我应该有两张桌子,messages_sent
并且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)
)