Я новичок в базах данных и хотел бы знать, как лучше хранить личные сообщения в базе данных (с помощью 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
? Или еще что-то еще? Любые указатели в правильном направлении будут очень благодарны.
EDIT:
Чтобы уточнить, я после хорошего шаблона проектирования базы данных, чтобы решить эту проблему. Если кто-то может помочь с SQLAlchemy, это было бы здорово, но ни в коем случае не обязательно.
но столбец from_id
будет идентификатором пользователя отправителя, а to_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)
)