Dopo aver lavorato a un mio piccolo progetto, ho deciso di provare a utilizzare solo MySQLDB, senza SQL Alchemy.
Funziona bene ed è abbastanza facile da usare, ecco un esempio (ho creato una piccola classe che gestisce tutto il lavoro alla base di dati)
import MySQLdb
from MySQLdb.cursors import DictCursor
class DatabaseBridge():
def __init__(self, *args, **kwargs):
kwargs['cursorclass'] = DictCursor
self.cnx = MySQLdb.connect (**kwargs)
self.cnx.autocommit(True)
self.cursor = self.cnx.cursor()
def query_all(self, query, *args):
self.cursor.execute(query, *args)
return self.cursor.fetchall()
def find_unique(self, query, *args):
rows = self.query_all(query, *args);
if len(rows) == 1:
return rows[0]
return None
def execute(self, query, params):
self.cursor.execute(query, params)
return self.cursor.rowcount
def get_last_id(self):
return self.cnx.insert_id()
def close(self):
self.cursor.close()
self.cnx.close()
database = DatabaseBridge(**{
'user': 'user',
'passwd': 'password',
'db': 'my_db'
})
rows = database.query_all("SELECT id, name, email FROM users WHERE is_active = %s AND project = %s", (1, "My First Project"))
(si tratta di un esempio di muto).
Funziona come un fascino MA si deve prendere in considerazione questi:
- multithreading non è supportato! Va bene se non si lavora con
multiprocessing
da Python.
- Non avrete tutti i vantaggi di SQLAlchemy (wrapper di Database to Class (modello), generazione di query (selezionare, dove, order_by, ecc.)). Questo è il punto chiave su come si desidera lavorare con il proprio database.
Ma d'altra parte, e come SQLAlchemy, c'è protezioni agains't attacchi di SQL injection:
Una query di base sarebbe stato così:
cursor.execute("SELECT * FROM users WHERE data = %s" % "Some value") # THIS IS DANGEROUS
Ma si dovrebbe fare :
cursor.execute("SELECT * FROM users WHERE data = %s", "Some value") # This is secure!
Hai visto la differenza? Leggi di nuovo;)
La differenza è che ho sostituito %
, per ,
: passiamo gli argomenti come ... argomenti all'esecuzione, e questi sono sfuggiti. Quando si utilizza %
, gli argomenti non sono sfuggiti, abilitando gli attacchi SQL Injection!
L'ultima parola è che dipende dal vostro utilizzo e da ciò che intendete fare con il vostro progetto. Per me, SQLAlchemy era in overkill (è uno script di shell di base!), Quindi MysqlDB era perfetto.