Найти - Пользователи
Полная версия: Запись в БД с условием
Начало » Python для новичков » Запись в БД с условием
1 2 3 4 5 6 7
staxbel
Всем доброго дня. получаю данные с последовательного порта, и записываю 8 байт данных в БД, но есть проблема, иногда в данных появляется мусор таких данных хочу избежать. Может есть возможность записать в БД данные которые имеют только цифры, если условие не выполнено - просто продолжаем дальше. Сейчас код у меня выглядит так:
 import serial
import time
import datetime
import db
from datetime import datetime
while True :
    connection = db.getConnection()
    #print ("Соединение установлено")
    ser = serial.Serial('COM3', timeout=1)
    cmd = bytearray([0x3])
    ser.write(cmd)
    reply = ser.read(22)
    out = reply[11:16]
    print(out)
    ser.close()
    try :
        cursor = connection.cursor()
        sql = "Update silos3 set weight = %s, date = %s where id = %s " 
        datetime.strptime("12/31/2000", "%m/%d/%Y")
        newHireDate = datetime.today()
        rowCount = cursor.execute(sql, (out, newHireDate, 1 ) )
        connection.commit() 
        print ("Данные изменены", newHireDate)
    finally:
        # Закрыть соединение
        connection.close()
PEHDOM
staxbel Зачем вы каждый раз открываете и закрываете последовательный порт, а так же соединение с БД еслиесли вы бесконечно дрочите порт без каких либо задержек?
staxbel
Может есть возможность записать в БД данные которые имеют только цифры, если условие не выполнено - просто продолжаем дальше.
Ну в out у вас байты, пербразуйте в строку, и посмотрите. Для этого в пайтоне есть метод str.isdigit()
 '123'.isdigit()  # True
 'abc123'.isdigit()  # False
типа :
 out_srt = out.decode('сюда_вписать_кодировку_в_которой_вы_получаете_данные') # тут вы можете поймать исключение если у вас там будет таки реальный "мусор", поэтому лучше вставить его в блок try-excrpt и отслеживать DecodeError
if out_str.isdigit():
    #тут пишем в БД
else:
   #тут не пишем в БД
Rodegast
 >>> '123.15'.isdigit()
False
PEHDOM
Rodegast естевенно, точка не цифра.
Rodegast
> точка не цифра.

Да, но 123.15 является числом. По этому я не рекомендовал бы пользоваться этими методами.
PEHDOM
ну так естевенно что проверять нужно на то на что нужно Если нужно на цифры то на цифры, если на числа то на числа. Топикстартер говорит что должны быть “данные которые имеют только цифры”. для этого isdigit() вполне подходит.
Rodegast
> Топикстартер говорит что должны быть “данные которые имеют только цифры”

Часто топикстартеры не знают чем числа отличатся от цифр.
py.user.next
staxbel
Может есть возможность записать в БД данные которые имеют только цифры, если условие не выполнено - просто продолжаем дальше.
Можешь выбрать цифры
  
def select_data(data):
    tmp = data[11:16]
    digits = bytes(i for i in tmp if chr(i).isdigit())
    out = digits
    return out
 
...
 
reply = ser.read(22)
clean_data = select_data(reply)
В clean_data будут выбраны цифры.

Принцип работы
  
>>> def select_data(data):
...     tmp = data[11:16]
...     digits = bytes(i for i in tmp if chr(i).isdigit())
...     out = digits
...     return out
... 
>>> bytes([0x40, 0x32, 0x41, 0x33] * 10)
b'@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3'
>>> 
>>> select_data(bytes([0x40, 0x32, 0x41, 0x33] * 10))
b'323'
>>>

Если же надо определять, имеют ли данные только цифры, то также надо написать функцию
  
def select_data(data):
    out = data[11:16]
    return out
 
def check_data(data):
    out = data.isdigit()
    return out
 
...
 
reply = ser.read(22)
clean_data = select_data(reply)
f_data_onlydigits = check_data(clean_data)
В clean_data будут выбранные данные из ответа, а в f_data_onlydigits будет True или False в зависимости от того, состоят ли выбранные данные только из цифр.

Принцип работы
  
>>> def check_data(data):
...     out = data.isdigit()
...     return out
... 
>>> bytes([0x40, 0x32, 0x41, 0x33] * 10)
b'@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3'
>>> 
>>> check_data(bytes([0x40, 0x32, 0x41, 0x33] * 10))
False
>>> 
>>> bytes([0x33, 0x32, 0x35, 0x33] * 10)
b'3253325332533253325332533253325332533253'
>>> 
>>> check_data(bytes([0x33, 0x32, 0x35, 0x33] * 10))
True
>>>

По поводу всех разговоров про целые числа или вещественные числа или рациональные дроби там - всё это проверяется внутри функции check_data() путём дописывания её содержимого, которое также может вызывать вспомогательные функции, которые пишутся для проверки отдельных вопросов. Функции вызывают функции, которые вызывают функции, которые вызывают функции и так далее.
PEHDOM
Rodegast
Часто топикстартеры не знают чем числа отличатся от цифр.
ну зато потом их ждет “просветление”
Rodegast
> Принцип работы

Это ещё один пример того как делать не нужно. Ибо Простое лучше, чем сложное. и Сложное лучше, чем запутанное..
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB