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