Also, ich habe drei Tabellen:Wie verknüpfe ich drei Tabellen mit SQLalchemy und behält alle Spalten in einer der Tabellen?
Die Klasse defenitions:
engine = create_engine('sqlite://test.db', echo=False)
SQLSession = sessionmaker(bind=engine)
Base = declarative_base()
class Channel(Base):
__tablename__ = 'channel'
id = Column(Integer, primary_key = True)
title = Column(String)
description = Column(String)
link = Column(String)
pubDate = Column(DateTime)
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key = True)
username = Column(String)
password = Column(String)
sessionId = Column(String)
class Subscription(Base):
__tablename__ = 'subscription'
userId = Column(Integer, ForeignKey('user.id'), primary_key=True)
channelId = Column(Integer, ForeignKey('channel.id'), primary_key=True)
HINWEIS: Ich weiß user.username eindeutig sein sollte, müssen das beheben, und ich bin nicht sicher, warum sqlalchemy erstellt einige Zeilennamen mit den Anführungszeichen.
Und ich versuche, einen Weg zu finden, alle Kanäle abzurufen, sowie eine Angabe darüber, welche Kanäle ein bestimmter Benutzer (identifiziert durch user.sessionId zusammen mit user.id) hat ein Abonnement auf.
Zum Beispiel sagen wir haben vier Kanäle: channel1, channel2, channel3, channel4; ein Benutzer: user1; Wer hat ein Abonnement auf channel1 und channel4? Die Abfrage für user1 zurückkehren würde so etwas wie:
channel.id | channel.title | subscribed
---------------------------------------
1 channel1 True
2 channel2 False
3 channel3 False
4 channel4 True
Dies ist ein Best-Case-Ergebnis, aber da ich absolut keine Ahnung, wie haben, wie das gezeichnete Säule zu erreichen, habe ich versucht worden, anstatt die bestimmte Benutzer zu erhalten ID in den Zeilen, in denen der Benutzer eine Subskription hat und wo eine Subskription fehlt, lassen Sie sie einfach leer.
Die Datenbank-Engine, die ich zusammen mit SQLalchemy atm verwenden. ist sqlite3
Ich habe seit zwei Tagen meinen Kopf über dies gekratzt, ich habe kein Problem, alle drei über die Abonnementtabelle zusammenzufügen, aber dann alle Kanäle, wo der Benutzer kein Abonnement hat, bekommt weggelassen.
Ich hoffe, ich habe es geschafft, mein Problem ausreichend zu beschreiben, danke im Voraus.
EDIT: Managed dies in einer etwas klobig Weise zu lösen, um eine Unter Abfrage mit:
# What a messy SQL query!
stmt = query(Subscription).filter_by(userId = uid()).join((User, Subscription.userId == User.id)).filter_by(sessionId = id()).subquery()
subs = aliased(Subscription, stmt)
results = query(Channel.id, Channel.title, subs.userId).outerjoin((subs, subs.channelId == Channel.id))
Allerdings werde ich für eine elegantere Lösung suchen fortsetzen, so antwortet immer noch sehr beliebt sind sehr willkommen.
Können Sie Ihre Modell-/Tabellendefinitionen hinzufügen? Abhängig davon, ob Sie den Declarational Mapper, den Normal Mapper oder die Plain Tabellen verwenden, unterscheidet sich die Syntax ein wenig. – Wolph
Fertig und aktualisierte Frage, das wäre der Deklarationsmapper, wenn ich mich nicht irre. – jimka
Das ist die Deklaration Mapper in der Tat :) – Wolph