[Python-es] Wrapper MySQL

Juan José Rojo jjrojoc en hotmail.com
Sab Ene 26 16:30:10 CET 2008


Siguiendo con el wrapper, deciros que ya está operativo y su uso para operaciones no demasiado complejas como seleccionar, buscar, ordenar, borrar, insertar o actualizar datos es bueno, a falta de introducir operaciones más complejas (como inner join, etc).

http://pytpv.svn.sourceforge.net/viewvc/pytpv/trunk/src/sqlobject.py?view=markup 

--------------------------
> From: jjrojoc en hotmail.com
> To: python-es en aditel.org
> Date: Wed, 16 Jan 2008 11:44:14 +0000
> Subject: [Python-es] Wrapper MySQL
> 
> 
> Buscando por ahí, he encontrado este wapper para sql, os dejo el código del archivo y el link del artículo, a ver si los entendidos nos podéis desmenuzar el código, yo hay cosas como el __delitem__ y alguna otra que no he conseguido hacer funcionar, también alguna idea para mejorarlo como añadir "inner join", falta también un controlador de campos par insertar o actualizar registros de un campo en concreto, sin más y gracias por su atención.
> 
> http://www.devx.com/dbzone/Article/22093/1954?pf=true
> 
> #!/usr/bin/python
> 
> # Modify the following to support other databases:
> import MySQLdb
> dbmod = MySQLdb
> get_tables = "show tables;"  # how to get a list of tables
> row_id = "_rowid"  # name of the row ID keyword
> 
> import types
> 
> class table:
> 	"""Emulates a list of DB rows, where each row is a tuple.
> 		May also be accessed via a string, to pull entire columns.
> 		Examples:
> 			t = table(db, "users")
> 			### select and organize data
> 			t.search("id< 0:  # add support for negative (from the end) indexing
> 				item = len(self) + item
> 				if item < 0:
> 					raise IndexError, "index too negative"
> 			q = q + " limit %s, 1" % (item)
> 			self._query(q)
> 			return self.dbc.fetchone()
> 		else:
> 			raise IndexError, "unsupported index type"
> 
> 	def __setitem__(self, key, value):
> 		"Not yet implemented."
> 		if isinstance(key, types.IntType):
> 			pass
> 		else:
> 			raise IndexError, "index not a number"
> 
> 	def __delitem__(self, item):
> 		# the method described in the article:
> 		#q = "select %s from %s %s %s limit %s, 1" % ("_rowid", self.name, self._search, self._sort, item)
> 		#self._query(q)
> 		#rid = self.dbc.fetchone()[0]
> 		#q = "delete from %s where %s=%s" % (self.name, "_rowid", rid)
> 		#self._query(q)
> 		
> 		# a simpler method:
> 		rid = self[item][-1]
> 		q = "delete from %s where %s=%s" % (self.name, row_id, rid)
> 		self._query(q)
> 
> 	def insert(self, *row):
> 		fmt = ("%s," * len(row))[:-1]
> 		q = "insert into %s values (%s)" % (self.name, fmt)
> 		self._query(q, row)
> 
> 	def __iter__(self):
> 		self._new_cursor()
> 		q = "select *%s from %s %s %s" % (self._row_id, self.name, self._search, self._sort)
> 		self._query(q)
> 		return self
> 
> 	def next(self):
> 		r = self.dbc.fetchone()
> 		if not r:
> 			self._new_cursor()
> 			raise StopIteration
> 		return r
> 
> 	def __len__(self):
> 		self._query("select count(*) from %s %s" % (self.name, self._search))
> 		r = int(self.dbc.fetchone()[0])
> 		return r
> 
> class db:
> 	"""
> 	A basic wrapper for databases.  Usage is as follows:
> 		d = db(user="user", passwd="password", db="database")
> 		table_name = d.tables()[0]
> 		t = d.table(table_name)
> 	The parameters for connect() and __init__() are keyword arguments, given
> 	directly to your database module.
> 
> 	If you access the same table from several places in your code, there is no
> 	need to pass the table object around.  This class will keep track of them
> 	for you and provide the existing copy of a table, if one already exists.
> 	"""
> 	def __init__(self, **args):
> 		self._tables = {}
> 		if args:
> 			self.connect(**args)
> 
> 	def tables(self):
> 		q = get_tables
> 		c = self.obj.cursor()
> 		a = c.execute(q)
> 		ts = []
> 		for row in c.fetchall():
> 			#print row
> 			ts.append(row[0])
> 
> 		return ts
> 
> 	def table(self, name):
> 		try:
> 			return self._tables[name]
> 		except:
> 			self._tables[name] = table(self, name)
> 			return self._tables[name]
> 
> 	def connect(self, **args):
> 		self.obj = dbmod.connect(**args)
> 
> if __name__ == "__main__":
> 	print "this file should not be executed"
> 
> _________________________________________________________________
> Tecnología, moda, motor, viajes,…suscríbete a nuestros boletines para estar siempre a la última
> Guapos y guapas, clips musicales y estrenos de cine. 

_________________________________________________________________
La vida de los famosos al desnudo en MSN Entretenimiento
http://entretenimiento.es.msn.com/


Más información sobre la lista de distribución Python-es