from itertools import chain from psycopg2.extras import execute_values from connect import * import json file_psycopd = 'psycopd_con.json' file_local = 'local_device.json' file_tuya = 'tuya_con.json' class DeviceError(Exception): pass def update_base(): conn = connect_base() cursor = conn.cursor() count = 0 try: with open(file_tuya, 'r', encoding='utf-8') as f: tuya_devices = json.load(f) if tuya_devices['error']: raise DeviceError(tuya_devices['error']) except Exception as e: print(f'Ошибка update_base: {e}') with open(file_local, 'r', encoding='utf-8') as f: local_devices = json.load(f) for device in tuya_devices: if device['result']['id'] == [v for v in local_devices.values()][count]['gwId']: cursor.execute("UPDATE upanel_device SET local_key = %s, name = %s " "WHERE device_id= %s", (device['result']['local_key'], device['result']['name'], device['result']['id'])) conn.commit() count += 1 cursor.close() def add_base(): conn = connect_base() cursor = conn.cursor() try: with open(file_local, 'r', encoding='utf-8') as f: local_devices_dict = json.load(f) local_devices = {i + 1: v for i, v in enumerate(local_devices_dict.values())} cursor.execute("SELECT * FROM upanel_device") devices = list(chain.from_iterable(cursor.fetchall())) execute_values(cursor, "INSERT INTO upanel_device " "(device_ip, device_id,device_version) " "VALUES %s", [(local_devices_dict[local_devices[device]['ip']]['ip'], local_devices_dict[local_devices[device]['ip']]['gwId'], local_devices_dict[local_devices[device]['ip']]['version'],) for device in local_devices if local_devices[device]['ip'] not in devices]) conn.commit() cursor.close() except Exception as e: print(f'ошибка add_base: {e}') with open('error_add.json', 'w', encoding='utf-8') as f: json.dump({'Error_add':e}, f) def delete_base(): conn = connect_base() cursor = conn.cursor() try: with open(file_local, 'r', encoding='utf-8') as f: local_devices_dict = json.load(f) ip_file=sorted([v for k,v in enumerate(local_devices_dict)]) cursor.execute('SELECT * FROM upanel_device') cursor.executemany("DELETE FROM upanel_device WHERE device_ip=%s", [tuple(str(item) for item in ip[2].split()) for ip in cursor.fetchall() if ip[2] not in ip_file]) conn.commit() except Exception as e: print(f'Ошибка delete_base: {e}') with open('error_delete.json', 'w', encoding='utf-8') as f: json.dump({'Error_delete':e}, f) if __name__ == '__main__': add_base() update_base() delete_base()