2010-07-28 5 views
1

je le code suivant:comment créer une instruction SQL dynamique w/python et mysqldb


    def sql_exec(self, sql_stmt, args = tuple()): 
     """ 
     Executes an SQL statement and returns a cursor. 

     An SQL exception might be raised on error 

     @return: SQL cursor object 
     """ 
     cursor = self.conn.cursor() 
     if self.__debug_sql: 
      try: 
       print "sql_exec: " % (sql_stmt % args) 
      except: 
       print "sql_exec: " % sql_stmt 

     cursor.execute(sql_stmt, args) 
     return cursor 

    def test(self, limit = 0): 
     result = sql_exec(""" 
      SELECT 
       * 
      FROM 
       table 
      """ + ("LIMIT %s" if limit else ""), (limit,)) 
     while True: 
      row = result.fetchone() 
      if not row: 
       break 
      print row 
     result.close() 

Comment puis-je écrire bien test() de sorte qu'il fonctionne avec ou sans « limite » sans avoir à écrire deux requêtes?

Répondre

0

D'abord, ne le faites pas.

Ne créez pas de SQL «à la volée». C'est un cauchemar de sécurité. Cela causera plus de problèmes que cela semble résoudre.

Ensuite, lisez la page MySQL sur LIMIT. Ils suggèrent d'utiliser un grand nombre.

SELECT * FROM tbl LIMIT 18446744073709551615; 

Changer votre défaut de 0 à 18446744073709551615.

Si vous ne pas comme ça, utilisez alors une déclaration if et écrire deux versions du SELECT. Il est préférable à long terme d'avoir deux instructions SELECT similaires sans trou de sécurité. Troisièmement, ne pas tester de cette façon.

Utilisez unittest. http://docs.python.org/library/unittest.html

+0

Merci S. Lott, Je suis au courant du cauchemar de la sécurité (injections SQL et ce non) qui pourrait se produire si je construire mon propre SQL, mais ayant deux requêtes identiques est sans tracas d'entretien. La suggestion LIMIT est agréable. En ce qui concerne unittest, je dois mettre du temps pour apprendre à l'utiliser, semble utile. Merci, Elias –

+1

@lallous: "avoir deux requêtes identiques est la peine de maintenance". Pas vraiment. La menace SQL Injection est un problème. Deux requêtes identiques ne valent guère la comparaison avec la responsabilité potentielle des données piratées. –

Questions connexes