2 Stimmen

Brauche Hilfe bei Joins in Sqlalchemy

Ich bin neu in Python und SQL Alchemy, aber nicht in den zugrunde liegenden Entwicklungs- und Datenbankkonzepten. Ich weiß, was ich tun möchte und wie ich es manuell tun würde, aber ich versuche zu lernen, wie ein ORM funktioniert.

Ich habe zwei Tabellen, Bilder und Schlüsselwörter. Die Tabelle Bilder enthält eine id-Spalte, die als Primärschlüssel dient, sowie einige andere Metadaten. Die Tabelle Schlüsselwörter enthält nur eine id-Spalte (Fremdschlüssel zu Images) und eine Schlüsselwortspalte. Ich versuche, diese Beziehung mithilfe der deklarativen Syntax ordnungsgemäß zu deklarieren, was ich meiner Meinung nach auch richtig gemacht habe.

Base = declarative_base()

class Keyword(Base):
    __tablename__ = 'Keywords'
    __table_args__ = {'mysql_engine' : 'InnoDB'}

    id = Column(Integer, ForeignKey('Images.id', ondelete='CASCADE'),
            primary_key=True)
    keyword = Column(String(32), primary_key=True)

class Image(Base):
    __tablename__ = 'Images'
    __table_args__ = {'mysql_engine' : 'InnoDB'}

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(256), nullable=False)
    keywords = relationship(Keyword, backref='image')

Dies ist eine Beziehung von vielen zu vielen. Ein Bild kann viele Schlüsselwörter haben, und ein Schlüsselwort kann sich auf viele Bilder beziehen.

Ich möchte eine Stichwortsuche für meine Bilder durchführen. Ich habe Folgendes ausprobiert, ohne Erfolg.

Vom Konzept her wäre das schön gewesen, aber ich verstehe, warum es nicht funktioniert.

image = session.query(Image).filter(Image.keywords.contains('boy'))

Ich erhalte immer wieder Fehlermeldungen über keine Fremdschlüsselbeziehung, die mir klar definiert erscheint. Ich habe gesehen, dass es darum geht, die richtige "Verknüpfung" zu finden, und ich verwende "from sqlalchemy.orm import join", aber ich habe immer noch kein Glück.

image = session.query(Image).select_from(join(Image, Keyword)).\
        filter(Keyword.keyword == 'boy')

Ich habe die spezifische Verknüpfungsklausel zur Abfrage hinzugefügt, um sie zu unterstützen, obwohl ich dies nach meinem Verständnis nicht tun sollte.

image = session.query(Image).select_from(join(Image, Keyword,
    Image.id==Keyword.id)).filter(Keyword.keyword == 'boy')

Also wechselte ich schließlich die Taktik und versuchte, die Schlüsselwörter abzufragen und dann den Rückverweis zu verwenden. Wenn ich jedoch versuche, die ".images" Iteration über das Ergebnis zu verwenden, erhalte ich eine Fehlermeldung, dass die Eigenschaft "image" nicht existiert, obwohl ich sie als Backreferenz deklariert habe.

result = session.query(Keyword).filter(Keyword.keyword == 'boy').all()

Ich möchte einen eindeutigen Satz von Bildübereinstimmungen zu einer Reihe von Schlüsselwörtern abfragen können. Ich komme einfach nicht an die Syntax heran und habe Tage damit verbracht, die SQL Alchemy-Dokumentation zu lesen und zu versuchen, es selbst herauszufinden.

Ich wäre sehr dankbar, wenn mir jemand sagen könnte, was ich übersehe.

1voto

Steve Punkte 31

Es scheint, dass ich immer noch die falsche Version von join erhalten habe, auch wenn ich die Version unter sqlalchemy.orm importiert habe. Ich habe dies getan, um das Problem zu beheben:

from sqlalchemy.orm.util import join as join_

image = session.query(Image).select_from(join_(Image, Keyword)).\
    filter(Keyword.keyword == 'boy')

Ist das wirklich die "richtigste" Lösung, oder übersehe ich eine Nuance von Python? Da ich noch lerne, möchte ich die Dinge die "richtigste" Weg, wie von denen mit mehr Erfahrung beraten zu tun. Danke!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X