sqlalchemy und Klassen auslagern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hallo, ich hab angefangen mich mit SQLAlchemy zu beschäftigen und stoße da im Moment auf Probleme, wahrscheinlich hab ich nur ein Fehler in meinem Denkansatz...

Ich hab erst ein Skript geschrieben, in dem ich Klassen definiert habe mit den dazugehörigen Tabellen und das hat alles wunderbar funktioniert. Dann wollte ich die Klassen auslagern, weil ich mit einem anderen Script auf die gleiche Datenbank zugreifen wollte und somit dort ja die selben Klassen brauche (Ich hoffe das macht Sinn was ich hier schreibe).

Mein Idee sieht nun so aus:
Die Datei mit den Klassen:

Code: Alles auswählen

#!/usr/bin/python

from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, Numeric
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relation, backref, clear_mappers, mapper

Base = declarative_base()
class Particle(Base):
    __tablename__ = 'particles'

    id = Column(Integer, primary_key=True)
    iteration_id = Column(Integer, ForeignKey('iterations.id'))
    imn = Column(Integer)
    beta2 = Column(Numeric)
    gamma2 = Column(Numeric)

    def __init__(self, imn, beta2, gamma2):
        self.imn = imn
        self.beta2 = beta2
        self.gamma2 = gamma2

    def __repr__(self):
        return "<Particle %s (Iteration: '%s')>" % (self.imn,self.iteration_id)


class Iteration(Base):
    __tablename__ = 'iterations'
    id = Column(Integer, primary_key=True)
    resolution = Column(Numeric)
    comment = Column(String)

    particle = relation(Particle, backref=backref('iterations', order_by=id))

    def __init__(self, comment, resolution):
        self.resolution = resolution
        self.comment = comment

    def __repr__(self):
        return "<Iteration %s ('%s')>" % (self.id, self.comment)
In meinem Script zu importieren und dort dann zu nutzen:

Code: Alles auswählen

#!/usr/bin/python

import sys
import os.path
import time
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, Numeric
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relation, backref, clear_mappers, mapper
from optparse import OptionParser, OptionGroup

from emdbca import Particle, Iteration

Base = declarative_base()

def main():
    engine = create_engine('sqlite:///test.db')

    metadata = Base.metadata
    metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    session = Session()
    particles_table = Particle.__table__
    iterations_table = Iteration.__table__


    clear_mappers()
    mapper(Iteration, iterations_table, properties={
        'particle':relation(Particle, backref='iteration', cascade='all, delete, delete-orphan')
        })
    mapper(Particle, particles_table)



    iter = Iteration('comment',resolution=None)
    session.add(iter)
    iter.particle.append(Particle(
            1,
            1.1,
            1.2))
    session.commit()

    session.close()

if __name__ == "__main__":
    main()
Da bekomme ich dann unter anderem den Fehler, dass die Tabelle iterations nicht erstellt wurde.

Kann mir jemand erklären was ich an der Stelle falsch gemacht habe? Wenn ich die Klassen in meinem Script deklariere funktioniert alles. Aber ich importiere sie ja oben mit "from emdbca import Particle, Iteration"...

Hoffe es ist nich so viel wirres Zeug, aber ich hab versucht das Beispiel so minimal wie möglich zu halten.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Du solltest die 'Base' - Klasse aus dem importierten Modul verwenden. Die Tabelle 'iterations' ist nämlich mit deren metadata verknüpft. In deinem Skript erzeugst du eine neue Klasse 'Base' mit eigener metadata, in der die Tabelle natürlich nicht bekannt ist.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

super, das war der Fehler... Vielen Dank...
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

würmchen hat geschrieben:super, das war der Fehler... Vielen Dank...
Es sieht auch noch so aus, als könntest du im Hauptprogramm jetzt einige Imports entfernen.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Ja, im Hauptprogramm hatte ich die Klassen nur mal auskommentiert... Die imports hab ich jetzt schon "geputzt", hatte es nur vergessen für mein Minimal test hier raus zunehmen...
Antworten