Ich bin neu in Datenbanken und möchte wissen, wie Sie persönliche Nachrichten in einer Datenbank (mit SQLAlchemy) am besten speichern.Personal Messaging System in Datenbank
Weil ich nicht sicher war, habe ich die folgende Tabelle versucht, für PMs
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)
)
und dann wird diese kartiert
session.mapper(User, user_table, properties={
'messages_sent': relation(PM, backref='sender'),
'messages_received': relation(PM, backref='receiver')
})
bekomme ich folgende Fehlermeldung:
Die Join-Bedingung zwischen übergeordneten/untergeordneten Tabellen in der Beziehung User.messages_sent konnte nicht ermittelt werden. Geben Sie einen Ausdruck 'primaryjoin' an. Wenn es sich um eine Viele-zu-Viele-Beziehung handelt, wird auch 'sekundäres Verbinden' benötigt.
Von dem, was ich bisher verstehe, ist dies eine Eins-zu-viele-Beziehung, aber mit zwei Fremdschlüsseln der gleichen Klasse. Ist das überhaupt der richtige Ansatz oder soll ich zwei Tabellen haben, messages_sent
und messages_received
? Oder noch etwas anderes? Alle Hinweise in die richtige Richtung würden sehr geschätzt.
EDIT:
Um zu verdeutlichen, bin ich nach einem guten Datenbank-Design-Muster, um dies zu lösen. Wenn jemand mit SQLAlchemy helfen kann, wäre das großartig, aber keineswegs notwendig.
aber die
from_id
-column würde die Benutzer-ID des Senders, und dieto_id
würde die Benutzer-ID des Empfängers sein?
Genau.
Ihr Codebeispiel ist unvollständig.
Ich habe versucht, unnötigen Code in diesem Beitrag weglassen, scheint, ging ich zu weit. Hier sind die fehlenden Definitionen.
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)
)