from config import config from sqlalchemy import create_engine engine = create_engine(config.get('db_path')) from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship, backref from sqlalchemy import and_ from sqlalchemy.orm.exc import NoResultFound class Directory(Base): __tablename__ = 'directories' id = Column(Integer, primary_key = True) path = Column(String, nullable = False, index = True) parent_id = Column(Integer, ForeignKey('directories.id')) parent = relationship('Directory') def __init__(self, path): self.path = path def __repr__(self): return ''.format(self.path) @staticmethod def get(session, path): try: directory = session.query(Directory).filter(Directory.path == path).one() except NoResultFound: directory = Directory(path) session.add(directory) session.commit() return directory class Artist(Base): __tablename__ = 'artists' id = Column(Integer, primary_key = True) name = Column(String, nullable = False, index = True) def __init__(self, name): self.name = name def __repr__(self): return ''.format(self.name.encode('utf-8')) @staticmethod def get(session, name): try: artist = session.query(Artist).filter(Artist.name == name).one() except NoResultFound: artist = Artist(name) session.add(artist) session.commit() return artist class Album(Base): __tablename__ = 'albums' id = Column(Integer, primary_key = True) name = Column(String, nullable = False, index = True) artist_id = Column(Integer, ForeignKey('artists.id'), nullable = False) artist = relationship(Artist, backref = backref('albums', order_by = name)) def __init__(self, name, artist_id): self.name = name self.artist_id = artist_id def __repr__(self): return ''.format(self.name) @staticmethod def get(session, name, artist_id = None): try: album = session.query(Album).filter(Album.name == name).one() except NoResultFound: album = Album(name, artist_id) session.add(album) session.commit() return album class Track(Base): __tablename__ = 'tracks' id = Column(Integer, primary_key = True) name = Column(String, index = True) num = Column(Integer) filename = Column(String, nullable = False, index = True) file_index = Column(Integer) directory_id = Column(Integer, ForeignKey('directories.id'), nullable = False) artist_id = Column(Integer, ForeignKey('artists.id')) album_id = Column(Integer, ForeignKey('albums.id')) directory = relationship(Directory, backref = backref('tracks', order_by = filename)) def __init__(self, name, num, filename, file_index, directory_id, artist_id, album_id): self.name = name self.num = num self.filename = filename self.file_index = file_index self.directory_id = directory_id self.artist_id = artist_id self.album_id = album_id def __repr__(self): return u''.format(self.name) @staticmethod def get(session, name, num, filename, file_index, directory_id, artist_id, album_id): try: track = session.query(Track).filter(and_(Track.filename == filename, Track.file_index == file_index)).one() except NoResultFound: track = Track(name, num, filename, file_index, directory_id, artist_id, album_id) session.add(track) return track Base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind = engine)