Seite 1 von 1
sqlalchemy.exc.NoReferencedTableError: Could not find table
Verfasst: Samstag 16. Januar 2010, 19:38
von ska.ndal
hallo,
ich habe heute mit sqlalchemy angefangen. hab das tutorial durchgearbeitet und jetzt eigenes zeugs geschrieben. aber jetzt häng ich schon rehct lange an einem prob fest: ich habe eine bestehende db und möchte eine many-to-many relation erstellen. wenn ich die beiden klassen mit den daten als klassen erstelle und die beziehungen in einer einfachen tabelle hab ich erstmal keine fehlermeldung. aber sobald ich das
Code: Alles auswählen
photos = relation("photo", secondary=photo_tags, backref="tags")
einfüge, dann bekomm ich immer die fehlermeldung
sqlalchemy.exc.NoReferencedTableError: Could not find table 'photos' with which to generate a foreign key
kann mir vielleicht wer sagen, was das problem ist? hänge da schon recht lange dran und komm einfach nicht zur lösung.
vielen dank, ska.ndal
Verfasst: Samstag 16. Januar 2010, 20:38
von DasIch
Der ganze Code wäre schon recht hilfreich.
Verfasst: Samstag 16. Januar 2010, 20:54
von ska.ndal
Code: Alles auswählen
from sqlalchemy import create_engine, Table, Column, Integer, String, Text, MetaData, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relation
# from sqlalchemy.orm import backref
import time
engine = create_engine("sqlite:///photos.db", echo=True)
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
metadata = MetaData()
photo_tags = Table("photo_tags", metadata,
Column("photo_id", Integer, ForeignKey("photos.id")),
Column("tag_id", Integer, ForeignKey("tags.id"))
)
class tag(Base):
__tablename__ = "tags"
id = Column(Integer, primary_key=True)
name = Column(Text)
category_id = Column(Integer)
is_category = Column(Integer)
sort_priority = Column(Integer)
icon = Column(Text)
photos = relation("photo", secondary=photo_tags, backref="tags")
def __init__(self, name, category_id=0, is_category=1, sort_priority=0, icon=""):
self.name = name
self.category_id = category_id
self.is_category = is_category
self.sort_priority = sort_priority
self.icon = icon
def __repr__(self):
return "<Tag('%s','%s', '%s', '%s', '%s')>" % (self.name, self.category_id, self.is_category, self.sort_priority, self.icon)
class photo(Base):
__tablename__ = "photos"
id = Column(Integer, primary_key=True)
time = Column(Integer)
uri = Column(String)
description = Column(Text)
roll_id = Column(Integer)
default_version_id = Column(Integer)
rating = Column(Integer)
md5_sum = Column(Text)
def __init__(self, time=0, uri="", description="", roll_id=0, default_version_id=1, rating=0, md5_sum=""):
self.id = 0
self.time = time
self.uri = uri
self.description = description
self.roll_id = roll_id
self.default_version_id = default_version_id
self.rating = rating
self.md5_sum = md5_sum
def __repr__(self):
return "<Photo('%s','%s', '%s', '%s', '%s', '%s', '%s')>" % (self.time, self.uri, self.description, self.roll_id, self.default_version_id, self.rating, self.md5_sum)
gibt es gar keinen paste-service?
Verfasst: Samstag 16. Januar 2010, 21:15
von Käptn Haddock
Deine Tabelle heist 'photos', nicht 'photo'.
Cu Uwe
Verfasst: Samstag 16. Januar 2010, 21:18
von DasIch
tag und photo nutzen Base.metadata, deine photo_tags Tabelle nutzt metadata.
Der ForeignKey in der photo_id Spalte, findet natürlich in metadata nicht die photos Tabelle die in Base.metadata steckt.
EDIT: @Käptn Haddock Sollte kein Problem sein weil die Klasse photo heisst, wie auch immer dass löst die Exception nicht aus.
Verfasst: Samstag 16. Januar 2010, 21:31
von Käptn Haddock
@DasIch: Stimmt. Da muß ja die Klasse hin und nicht der Tabellenname...
Tip: Klassennamen mit einem führenden Großbuchstaben schreiben. (CamelCase oder wie das heisst

)
CU Uwe
Verfasst: Samstag 16. Januar 2010, 21:55
von ska.ndal
tag und photo nutzen Base.metadata, deine photo_tags Tabelle nutzt metadata.
Der ForeignKey in der photo_id Spalte, findet natürlich in metadata nicht die photos Tabelle die in Base.metadata steckt.
wie lös ich das dann also? dann mach ich die photo_tags auch als klasse, oder übergeb ich der statt metadata einfach Base oder wie?
das mit dem grossschreiben der klassen werd ihc machen.. das ist gut!
vielen dank
Verfasst: Samstag 16. Januar 2010, 22:01
von cofi
ska.ndal hat geschrieben:das mit dem grossschreiben der klassen werd ihc machen.. das ist gut!
PEP8 hat noch mehr zu bieten, einfach mal anschaun.
Verfasst: Samstag 16. Januar 2010, 22:09
von DasIch
ska.ndal hat geschrieben:wie lös ich das dann also? dann mach ich die photo_tags auch als klasse, oder übergeb ich der statt metadata einfach Base oder wie?
Übergib Base.metadata statt metadata.
Verfasst: Samstag 16. Januar 2010, 22:13
von Käptn Haddock
ska.ndal hat geschrieben:
wie lös ich das dann also?
oder
Code: Alles auswählen
photo_tags = Table("photo_tags", Base.metadata,
Column("photo_id", Integer, ForeignKey("photos.id")),
Column("tag_id", Integer, ForeignKey("tags.id"))
)
EDIT: Eventuell auch Base.metadata()... bin grad zu faul zum nachschauen
Cu Uwe
Verfasst: Samstag 16. Januar 2010, 22:37
von ska.ndal
ja mit Base.metadata funktioniert es..
vielen dank euch helfer_innen..
Verfasst: Sonntag 17. Januar 2010, 12:25
von ska.ndal
also ich kann zwar jetzt über mehrere tabellen abfragen, aber dafür nicht mehr in der einen. ich kann nicht mehr anfragen wie diese machen:
ich bekomme immer die fehlermeldung:
File "<stdin>", line 1
SyntaxError: keyword can't be an expression
kapier irgendwie nicht, was das problem dabei sein soll
Verfasst: Sonntag 17. Januar 2010, 13:54
von DasIch
filter und order_by nehmen ein ClauseElement entgegen, kein Keyword Argument wie filter_by. Statt photo.id=629 was natürlich ein SyntaxError ist, schreibst du photo.id == 629, welches ein ClauseElement zurückliefert.
Verfasst: Sonntag 17. Januar 2010, 13:59
von Käptn Haddock
ska.ndal hat geschrieben:
ich bekomme immer die fehlermeldung:
File "<stdin>", line 1
SyntaxError: keyword can't be an expression
kapier irgendwie nicht, was das problem dabei sein soll
Du brauchst einen Vergleich, keine Zuweisung an der Stelle AFAIR.
Gruß Uwe
Verfasst: Sonntag 17. Januar 2010, 14:35
von ska.ndal
ok so langsam erschliesst sich mir die sache...
ich danke euch!