Problem with sqlite

Gerhard Häring gh at ghaering.de
Sat Mar 29 14:41:12 EDT 2008


Ok, I'll review your code.

aiwarrior wrote:
> class db:
>     def __init__(self): #constructor
>         conn = sqlite3.connect('./db.db')
>         conn.isolation_level = None

Autocommit mode is mostly for newbies who forget to call commit.
Unfortunately, newbiews find enough other ways to shoot themselves in
the foot. So, in retrospect, maybe I should not have added that feature
to pysqlite ;-)

>         self.cursor = conn.cursor()
>         try:
>             self.cursor.execute("CREATE TABLE database
> (album,filepath)" )
>         except:
>             pass

try: except: pass without catching *specific* exceptions is generally a
very bad idea. If you're doing something stupid, or another error
happens than the one you want to ignore, you will never know this way.

>     def add_entry( self, eone , etwo ): #Add entry to database
>         self.cursor.execute( "INSERT INTO database (album,filepath)
> VALUES (?,?)", ( eone , etwo ) )
>         return 1 #TODO: exception handler
> 
>     def get_mediadb( self, print_db = False ):
>         self.cursor.execute( 'SELECT * FROM database' )
>         if (print_db == True):
>             print self.cursor.fetchall()

The if clause can be written as just "if print_db:".

>     def get_value( self, column ):
>         self.cursor.execute( "SELECT %s FROM database" % column )
>         for n in self.cursor:
>              print n
> 
>     def destructor(self):
>         self.cursor.close()

Just FYI, Python's "destructor" method is called "__del__", not
"destructor".

>     def walking_and_filling(db):
>         pass
> 
> 
> if __name__ == "__main__":
>     db = db()
>     #walking_and_filling( db )
>     for root, dirs, files in os.walk( '''foo_path/''',
> topdown=False ):
>         for name in files:
>             joined = os.path.join(root, name)
>             if (name[-3:] == 'mp3' and os.path.isfile( joined ) ):
>                 try:
>                     audio = MP3 (joined, ID3=EasyID3 )
>                     print (audio['album'])
>                     db.add_entry( joined, audio['album'] )
>                 except:
>                     pass

Now, this try: except: pass is most probably hiding the real error That
leads to the insert failing. Because you just ignored any errors, you
will never now what exactly went wrong here.

>     db.get_mediadb( print_db=True )
> 
> 
> When i execute this the database doesn't get filled with anything and
> the program stays running in memory for ever. [...]

HTH,

-- Gerhard



More information about the Python-list mailing list