Here is some more info, since i posted i have read around more and i
reordererd stuff and kinda have fixed my problem now, since im pretty newbie
with all this database stuff i dont have a clue why it works now and not
before. here is a breakdown of what i do now. Basically i have made a
model.py file with the entities:

model.py
=======================================
from elixir import Entity, setup_all
from elixir import Field, Unicode, ManyToOne, OneToMany

class File(Entity):
    path = Field(Unicode, required=True)
    filename = Field(Unicode, required=True)
    ext = Field(Unicode,required=True)
    season = Field(Unicode,required=False)
    episode = Field(Unicode,required=False)
    item = ManyToOne("Item")

class Item(Entity):
    path = Field(Unicode, primary_key=True)
    title = Field(Unicode, primary_key=True)
    type = Field(Unicode,required=True)
    year = Field(Unicode(4),default="0000",primary_key=True)
    imdbID = Field(Unicode,required=False)
    genres = Field(Unicode,required=False)
    library = ManyToOne("Library")
    files = OneToMany("File")

class Library(Entity):
    path = Field(Unicode, primary_key=True)
    name = Field(Unicode)
    items = OneToMany("Item")

#Setup tables
setup_all()
=======================================

mediaDatabase.py
=======================================
import os
from model import *
from elixir import metadata, session, create_all
dbfile = "mediaDatabase.sqlite"
metadata.bind = "sqlite:///%s" % dbfile

class Database:
    def initDb(self):
        if not os.path.exists(dbfile):
            create_all()

    def saveData(self):
        session.commit()

    def parseMediaItem(self,media):

        item =
Item(path=media["path"],title=media["title"],type=media["type"],year=media["year"])

        for f in media["files"]:
            file = File(path=f["path"],filename=f["rawname"],ext=f["ext"])
            file.season = f["season"]
            file.episode = f["episode"]
            item.files.append(file)

        libs = Library.query.all()
        foundlib = False
        for lib in libs:
            if lib.path == item.path:
                lib.items.append(item)
                foundlib = True
                break

        if not foundlib:
            print "parseMediaItem: No library database found, should not
happen!!(BUG)"

        return item

======================================

mediaGui.py  .. #Just the relevant lines
======================================
from model import Library, Item, File
from mediaDatabase import Database

DB = Database()

#Classes and gui stuff here
#calling ex. DB.parseMediaItem(m) where m is a instance of a class
inheriting Dict
#or calling DB.saveData() and so on.
#Even querying Items like movielist = Item.query.all()

if __name__ == "__main__":
    DB.initDb()
    app = QtGui.QApplication(sys.argv)
    myapp = MainForm()
    myapp.show()
    sys.exit(app.exec_())

======================================

Anyone who knows why it works now and not before? hehe...

Diez: Thanks for the suggestion with how to query the library! It looks as a
much better way than looping trough the library :)
oh and the application isnt multi-threaded or processed




On 25 February 2011 23:51, Diez B. Roggisch <[email protected]> wrote:

>
> Am 25.02.2011 um 21:30 schrieb Magnus Pettersson:
>
>
>  I have written all classes that handles the sqlite database in one
>> python file called "mediaDatabase.py" and then i want to import that
>> module into another file "mediaGui.py" to be able to query and write
>> to the database. but i always get a sqlalchemy.exc.OperationalError
>> that table does not exist or databse is locked (think it was the
>> "table does not exist" if i actually created and filled and some
>> entrys into the database.sqlite file from within the mediaDatabase.py,
>> and i get "database is locked" when i created the sqlite file and
>> entities from within the "mediaGui.py" file
>>
>> Here is the locked exception:
>> sqlalchemy.exc.OperationalError: (OperationalError) database is locked
>> u'INSERT INTO mediadatabase_item (path, title, type, year, "imdbID",
>> genres, library_path) VALUES (?, ?, ?, ?, ?, ?, ?)' (u'V:/Movies/',
>> u'Bedtime Stories', 'movie', u'2008', None, None, None)
>>
>> I tried to read around about sqlalchemy and found out that i need to
>> do something with the metadata or session but i cant figure out what &
>> how & where to put stuff
>>
>> A extract from mediaDatabase.py:
>>
>> from elixir import *
>> dbfile = "mediaDatabase.sqlite"
>>
>> class Database:
>>   def initDb(self):
>>       metadata.bind = "sqlite:///%s" % dbfile
>>       setup_all()
>>       if not os.path.exists(dbfile):
>>           create_all()
>>
>>   def saveData(self):
>>       session.commit()
>>
>>   def parseMediaItem(self,media):
>>       item =
>> Item(path=media["path"],title=media["title"],type=media["type"])
>>       libs = Library.query.all()
>>       for lib in libs:
>>           if lib.path == item.path:
>>               lib.items.append(item)
>>               foundlib = True
>>               break
>>
>> class File(Entity):
>>   path = Field(Unicode, required=True)
>>   filename = Field(Unicode, required=True)
>>   ext = Field(Unicode,required=True)
>>   item = ManyToOne("Item")
>>
>> class Library(Entity):
>>   path = Field(Unicode, primary_key=True)
>>   name = Field(Unicode)
>>   items = OneToMany("Item")
>>
>>
>> And some lines from mediaGui.py :
>>
>> from mediaDatabase import Database,Item,Library,File
>> MDB = Database()
>>
>> class MainForm(QtGui.QMainWindow, Ui_MainWindow):
>>     #init etc here
>>
>>     def update(self):
>>            #some code here
>>           MDB.parseMediaItem(m)  # HERE comes the error, right now
>> when writing its a
>>
>
>
> This looks all a bit weird - the DB-initialization class for example should
> be a singleton to prevent multiple instantiation, you shouldn't loop over
> all libs and then pick the matching one, but instead make a query and
> directly filter for it:
>
> Library.query.filter_by(media["path"]).items.append(Item(..., ))
>
> Your main problem I can't really comment on though, as you don't give the
> full stacktrace. Also, please give us the advice you already have found, so
> we can take a look.
>
> Is your application by any chance multi-theraded or multi-process (do
> several processes access the same DB-file)?
>
> Diez
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "SQLElixir" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/sqlelixir?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"SQLElixir" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlelixir?hl=en.

Reply via email to