Как я могу избежать жестко запрограммированных выражений sql с помощью этого скрипта Python?

Короче говоря, я получаю некоторые данные от своего датчика NRF24 на Raspberry Pi, а затем записываю их в базу данных. Согласно Codacy, мне нужно избегать жестко запрограммированных выражений sql, но я не знаю, что не так с моим скриптом. Вы можете мне помочь?

import time
from datetime import datetime
import sys
from struct import unpack
from RF24 import RF24
import psycopg2

irq_gpio_pin = None
con = None

radio = RF24(22, 0)

def get_data_from_node():
    if radio.available():
        while radio.available():
            length = 10
            receive_payload = radio.read(length)
            values = unpack('hhhhh',receive_payload)
            print "Node Number: "+str(values[0])+"\nLight: "+str(values[1])+" Humidity: "+str(values[2])+" Temperature: "+str(values[3])+" MQ6: "+str(values[4])
            #TIMESTAMPT = "(%s)",(datetime.now(),)
            LOG = "INSERT INTO LOGS (HUMIDITY,TEMPERATURE,PRESSURE,AIR_QUALITY,READING_TIME,LOG_TIME,BASE_STATION_ID) VALUES("+str(values[1])+","+str(values[2])+","+str(values[3])+","+str(values[4])+",('%s'),('%s'),1);" % (datetime.now(),datetime.now(),)
            write_to_db(LOG)

def write_to_db(LOG):
    try:
        con = psycopg2.connect(database='dname', user='uname', password='pass')
        con.cursor().execute(LOG)
        con.commit()
    except psycopg2.DatabaseError, e:
        print 'Error %s' % e
        sys.exit(1)

pipes = ["0Node", "1Node"]
radio.begin()
radio.setRetries(15,15)
radio.printDetails()

radio.openWritingPipe(pipes[1])
radio.openReadingPipe(1,pipes[0])
radio.startListening()

while 1:
    get_data_from_node()
    time.sleep(0.1)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
471
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на документации по psycopg (http://initd.org/psycopg/docs/usage.html), cursor.execute () может принимать 2 параметра, оператор SQL и последовательность значений, которые будут вставлены. Построение вашего оператора вставки таким образом позволяет psycopg правильно преобразовать значения Python в формат DB. и обеспечивает защиту от атак SQL-инъекций:

...
log = "INSERT INTO LOGS (HUMIDITY,TEMPERATURE,PRESSURE,AIR_QUALITY,READING_TIME,LOG_TIME,BASE_STATION_ID) VALUES (%s, %s, %s, %s, %s, %s, %s);"
vals = values[:4] + [datetime.now(),datetime.now(), 1]
write_to_db(log, vals)
...
def write_to_db(LOG, vals):
try:
    con = psycopg2.connect(database='dname', user='uname', password='pass')
    con.cursor().execute(LOG, vals)
    con.commit()
...

Другие вопросы по теме