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.

Reply via email to