У меня есть база данных mysql, в которой должны храниться криптовалютные данные с использованием sqlalchemy.Добавление и обновление объектов работает, хотя регистратор sqlalchemy дает мне KeyError для поля 'timestamp'.Я не могу понять смысл логов, поэтому надеюсь, что кто-нибудь подскажет мне направление ошибки.
Я пытался вставить данные метки времени в качестве объекта даты и времени, а также строку.
вызов
self.dbcon = DatabaseController()
self.bitmex_client = BitmexClient(self.parse_message, topics, True)
# self.trade_controller = TradeController(self.bitmex_client, self.dbcon)
def parse_message(self, msg):
# print(msg)
if 'table' in msg:
if msg['table'] == 'tradeBin1m':
# todo run analysis
if msg['data'][0]:
m = msg['data'][0]
ts = datetime.strptime(m['timestamp'], '%Y-%m-%dT%H:%M:%S.%fZ')
candle = Candle(ts, m['symbol'], m['open'], m['close'], m['high'], m['low'], m['volume'])
self.dbcon.store(candle)
основной материал
from sqlalchemy import *
from enums import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
engine = create_engine("mysql+pymysql://un:pw@localhost/db", echo="debug")
Session = sessionmaker(bind=engine)
class DatabaseController:
def __init__(self):
self.sesh = Session()
def store(self, item):
self.sesh.add(item)
self.sesh.commit()
def update(self, item):
if type(item) is Order:
self.sesh.query(Order).filter_by(order_id=item.order_id).update(
{col: getattr(item, col) for col in Order.__table__.columns.keys()})
self.sesh.commit()
def delete(self, item):
if type(item) is Order:
self.sesh.query(Order).filter_by(order_id=item.order_id).delete()
self.sesh.commit()
class Candle(Base):
__tablename__ = 'Candles'
timestamp = Column(DateTime(), primary_key=True)
symbol = Column(String(20), primary_key=True)
open = Column(FLOAT)
close = Column(FLOAT)
high = Column(FLOAT)
low = Column(FLOAT)
volume = Column(FLOAT)
def __init__(self, ts, symbol, price_open, price_close, high, low, volume):
self.timestamp = ts
self.symbol = symbol
self.open = price_open
self.close = price_close
self.high = high
self.low = low
self.volume = volume
log
2019-02-04 18:12:51,311 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-02-04 18:12:51+0100 [-] --- Logging error ---
2019-02-04 18:12:51+0100 [-] Traceback (most recent call last):
2019-02-04 18:12:51+0100 [-] File "C:\Users\busabuzz\AppData\Local\Programs\Python\Python37-32\lib\logging\__init__.py", line 983, in emit
2019-02-04 18:12:51+0100 [-] msg = self.format(record)
2019-02-04 18:12:51+0100 [-] File "C:\Users\busabuzz\AppData\Local\Programs\Python\Python37-32\lib\logging\__init__.py", line 829, in format
2019-02-04 18:12:51+0100 [-] return fmt.format(record)
2019-02-04 18:12:51+0100 [-] File "C:\Users\busabuzz\AppData\Local\Programs\Python\Python37-32\lib\logging\__init__.py", line 572, in format
2019-02-04 18:12:51+0100 [-] s = self.formatMessage(record)
2019-02-04 18:12:51+0100 [-] File "C:\Users\busabuzz\AppData\Local\Programs\Python\Python37-32\lib\logging\__init__.py", line 541, in formatMessage
2019-02-04 18:12:51+0100 [-] return self._style.format(record)
2019-02-04 18:12:51+0100 [-] File "C:\Users\busabuzz\AppData\Local\Programs\Python\Python37-32\lib\logging\__init__.py", line 384, in format
2019-02-04 18:12:51+0100 [-] return self._fmt % record.__dict__
2019-02-04 18:12:51+0100 [-] KeyError: 'timestamp'