2015-09-23 8 views
6

In base a PEP 8 (Maximum Line Length), una riga non deve mai essere più lunga di 79 caratteri.Come formattare query SQL lunghe in base a PEP8

Quando provo a dividere le query, però, mi imbatto in questioni come i personaggi di continuazione, e gettoni non validi, ecc

Per esempio, quale sarebbe il modo migliore per formattare questa query, secondo PEP8?

cursor.execute("SELECT pivot_id FROM aud_qty WHERE hshake1 is NULL AND ((strftime('%s', DATETIME('now')) - strftime('%s', sent_to_pivot))/(60)) > 30;") 
+0

Credo che questa domanda meriti una spiegazione migliore, per quanto riguarda l'esempio e il concetto stesso. Forse un po 'di tempo Pythonist potrebbe dare una visione più chiara per entrambe le situazioni. Ho aperto questa domanda a Quora, per ottenere ulteriori spiegazioni sull'argomento: https://www.quora.com/unanswered/How-can-I-respect-PEP-8-Maximum-Line-Length-79-characters -for-SQL-query-senza-causare-problemi-al-mio-codice – ivanleoncz

risposta

7

Che dire

cursor.execute("""SELECT pivot_id 
        FROM aud_qty 
        WHERE hshake1 is NULL 
        AND ((strftime('%s', DATETIME('now')) - 
         strftime('%s', sent_to_pivot))/(60)) > 30; 
       """) 

? Utilizzando """ o ''' si ottiene lo stesso comportamento di una stringa molto lunga, ma è possibile utilizzare le nuove linee proprio bene. E il tuo database non li disturberà neanche.

2

È necessario utilizzare stringhe multiline. Se dichiari la tua stringa con un solo " o ', sarà una stringa a riga singola, per creare stringhe multilinea, devi avvolgere la stringa con """ o '''. Ecco un esempio:

sql_query = """SELECT pivot_id 
FROM aud_qty 
WHERE hshake1 is NULL AND 
    ((strftime('%s', DATETIME('now')) - strftime('%s', sent_to_pivot))/(60)) > 30;""" 

Vale la pena ricordare che la creazione di query SQL non è manualmente solitamente una buona idea, in quanto può consentire attacchi di SQL injection e portare ad altri problemi.

0

come attacco

from models import AudQty,session 
update_limit = time.time()-30*60 # 30 minutes ago 
session.query(AudQty.pivot_id).filter(hshake1=None, 
           sent_to_pivot_lte=update_limit).all() 

stringhe possono anche essere multilinea senza virgolette triple, due citazioni stringhe una accanto all'altra automagically concatenare

cursor.execute("SELECT pivot_id FROM aud_qty " 
       "WHERE hshake1 is NULL AND " 
       "((strftime('%s', DATETIME('now')) - strftime('%s', sent_to_pivot))/(60)) > 30;") 
+0

Questa Alchimia SQL si sta utilizzando? – flybonzai

+1

sì, il primo esempio è sqlalchemy (ero tipo di essere un asino intelligente) –

0

Utilizzando triple virgolette come detto da @Johanness risposta , è la soluzione migliore.

Oltre a ciò, separare la query in una variabile separata è anche una buona pratica: offre maggiore chiarezza, leggibilità e un aspetto migliore (design) al codice.

come in questo esempio:

#!/usr/bin/python3 
""" Demonstrating SQLite3 queries using triple quotes. """ 

import sqlite3 

name  = "Dennis Ritchie" 
country = "USA" 
email = "[email protected]" 

dbfile = "users_db.lite" 
db  = sqlite3.connect(dbfile) 
cursor = db.cursor() 
table = "users" 

def create_user(): 
    insert = """ INSERT INTO '{0}' (id,name,country,email,password) 
       VALUES (1,'{1}','{2}','{3}'); 
      """.format(table,name,country,email) 
    cursor.execute(insert) 
    db.commit() 
    return None 

create_user() 

Ecco un problema su GitHub per ulteriori letture: query SQL VS Linea Lunghezza massima.

Problemi correlati