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)
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()
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.