From 07518d34d676df41bf2259cf66ba92444673c810 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Thu, 18 Aug 2011 20:59:16 +0200 Subject: Basic database support. --- db.py | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 db.py (limited to 'db.py') diff --git a/db.py b/db.py new file mode 100644 index 0000000..4819159 --- /dev/null +++ b/db.py @@ -0,0 +1,125 @@ +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) -- cgit v1.2.3