Редактировать: это то, что я придумал, чтобы получить желаемые результаты на основе данных ответов. я оберну это в функцию. конечно, не самый эффективный, но работает :)
for k in required_fields:
if k in response_data.keys():
print(k, response_data[k])
else:
print(k, None)
Я новичок в программировании (пара недель), это мой первый проект.
Я собираю данные временных рядов с веб-сокета обмена ByBit, преобразовываю их из JSON в Dict и сохраняю в базу данных. Веб-сокет отправляет только обновленные данные, поэтому один или несколько преобразованных ключей Dict могут отсутствовать. Я не могу понять, как объяснить это, не бросая KeyError. Я пытался использовать .get (), но он поддерживает только один аргумент, и я не уверен, как использовать его в итерации для создания нового dict.
В конечном итоге я хотел бы зафиксировать желаемые значения ключей в postgres, передав значение в виде «None», если они отсутствуют, ИЛИ вообще не передавая их, и оставив столбец таблицы пустым. Я в своей неопытности, я не уверен, что предпочтительнее.
Это пример сообщения после того, как я перешел в Dict, может изменяться вложенный словарь «data». Например, если цена не меняется между сделками, цена не будет отображаться в сообщении.
response_dict = ({'success': 'True', 'topic': 'trade.EOSUSD', 'data': [{'timestamp': '2019-06-20T10:06:36.030Z', 'symbol': 'EOSUSD', 'side': 'Sell',
'size': 757, 'price': 6.77, 'tick_direction': 'PlusTick', 'trade_id': '5658ec5f-90ce-4244-9192-3f29057e223a', 'cross_seq': 59462597}]})
РЕДАКТИРОВАТЬ: Для пояснения, это пример другого возможного сообщения из той же подписки, например, цена не изменилась, поэтому сервер не отправляет ключ цены, пара значений.
response_dict = ({'success': 'True', 'topic': 'trade.EOSUSD', 'data': [{'timestamp': '2019-06-20T10:06:36.030Z', 'symbol': 'EOSUSD', 'side': 'Sell',
'size': 757, 'tick_direction': 'PlusTick', 'trade_id': '5658ec5f-90ce-4244-9192-3f29057e223a', 'cross_seq': 59462597}]})
Это функция, которую я использую для извлечения вложенного словаря 'data', обязательные поля - это ключи, которые я хотел бы зафиксировать в базе данных.
def response_process(response_input):
if "topic" in response_input and "trade" in response_input["topic"]:
response_data = response_input["data"][0]
required_fields = ['timestamp', 'symbol',
'side', 'size', 'price', 'tick_direction']
response_data_2 = {key: value for key, value in response_data.items(
) if key in required_fields}
updated_timestamp = str(datetime.datetime.strptime(
response_data_2['timestamp'], '%Y-%m-%dT%H:%M:%S.%f%z'))
response_data_2['timestamp'] = updated_timestamp
commit_postgres(response_data_2)
и вот как я передаю эти данные в PostGres
def commit_postgres(response_data_input):
conn = psycopg2.connect(
"dbname='postgres' user='postgres' password = 'postgres123' host='localhost' port= '5432'")
cur = conn.cursor()
cur.execute(
"CREATE TABLE IF NOT EXISTS {symbol} (timestamp text, side text, size float, price float, tick_direction text)".format(**response_data_input))
conn.commit()
cur.execute("INSERT INTO {symbol}(timestamp, side, size, price, tick_direction) VALUES (%(timestamp)s, %(side)s, %(size)s, %(price)s, %(tick_direction)s)".format(
**response_data_input), (response_data_input))
conn.commit()