database in python ?
Pierre-Frédéric Caillaud
peufeu at free.fr
Mon Apr 11 09:30:17 EDT 2005
If you want Simple you can use the following piece of code.
It won't work if you have a million records, but it's a nice intelligent
flatfile storage with a select where + order by and limit emulator.
# #########################################################
class ListMgr( object ):
def __init__( self, klass, filename ):
self.filename = filename
self.klass = klass
self.load()
def load( self ):
try:
self.contents = pickle.load( open( self.filename ))
print "Loaded %d items %s in %s" % (len(self.contents), self.klass,
type(self))
except IOError:
print "Creating new contents for", type(self)
self.contents = {}
self.save()
if self.contents:
self.insert_id = max( self.contents.keys() ) +1
else:
self.insert_id = 1
def save( self ):
pickle.dump( self.contents, open( self.filename+'.tmp', 'w' ) )
os.rename( self.filename+'.tmp', self.filename )
print "Saved %d items %s in %s" % (len(self.contents), self.klass,
type(self))
def new( self, **params ):
return self.klass( **params )
def insert( self, obj ):
assert not hasattr( obj, 'id' ) or obj.id is None
obj.id = self.insert_id
self.insert_id += 1
self.contents[obj.id] = obj
def update( self, obj ):
assert obj.id is not None
self.contents[obj.id] = obj
def select( self, id ):
return self.contents[ id ]
def delete( self, id ):
del self.contents[ id ]
def count( self ):
return len( self.contents )
# where is a lambda function, order_by is a cmp function, limit is a slice
def select_multiple( self, where=None, order_by=None ):
if where:
c = filter( where, self.contents.itervalues() )
else:
c = self.contents.values()
if order_by:
c.sort( order_by )
return c
# #########################################################
class ListEntry( object ):
def __init__( self, **params ):
self.__dict__ = dict.fromkeys( self.get_fields() )
self.__dict__.update( params )
def get_fields( self ):
return ()
def display( self ):
print '-'*40
if hasattr( self, 'id' ):
print "id :",self.id
for k in self.get_fields():
print k," :",getattr(self,k)
print
# #########################################################
class AddressBookEntry( ListEntry ):
def get_fields( self ):
return 'name', 'address', 'zipcode', 'city', 'country', 'phone'
get_fields = classmethod( get_fields )
class AddressBook( ListMgr ):
def __init__( self, fname ):
super( AddressBook, self ).__init__( AddressBookEntry, fname )
More information about the Python-list
mailing list