Короче говоря, я получаю некоторые данные от своего датчика 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)






Основываясь на документации по 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()
...