compatibility fixes for the database schema

When using PostgreSQL:

- `CharField()` is limited to 255 character; use `TextField()`

- `IntegerField()` is signed, current unix timestamps exceeds
  its range; use correct TimestampField()
This commit is contained in:
2024-06-04 21:02:48 +02:00
parent 42af5df506
commit fe6472b73d
2 changed files with 15 additions and 14 deletions

View File

@@ -207,7 +207,7 @@ def charts():
zone = request.args.get('zone', None) zone = request.args.get('zone', None)
negative = request.args.get('negative', type=bool, default=False) negative = request.args.get('negative', type=bool, default=False)
logger.debug(f"API: GET /charts - {start_date} - {end_date}") logger.debug(f"API: GET /charts - {start_date} - {end_date}")
query = MainChartTable.select().where((MainChartTable.tm >= int(start_date)) & (MainChartTable.tm <= int(end_date))) query = MainChartTable.select().where((MainChartTable.tm >= int(start_date)/1000) & (MainChartTable.tm <= int(end_date)/1000))
logger.debug(f"{query}") logger.debug(f"{query}")
factor = 1 factor = 1
if negative: if negative:
@@ -226,13 +226,13 @@ def charts():
charts = [] charts = []
for p in result_ppes: for p in result_ppes:
czas = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(p.tm/1000)) czas = p.tm.strftime("%Y-%m-%d %H:%M:%S")
chart = { chart = {
'mp': p.mp, 'mp': p.mp,
'meter_type': p.meter_type, 'meter_type': p.meter_type,
'meter_type_url': urllib.parse.quote_plus(p.meter_type), 'meter_type_url': urllib.parse.quote_plus(p.meter_type),
'zone': p.zone, 'zone': p.zone,
'time_tm': p.tm, 'time_tm': int(p.tm.timestamp()*1000),
'time': czas, 'time': czas,
'value': p.value * factor 'value': p.value * factor
} }

View File

@@ -5,7 +5,7 @@ import http.cookiejar as cookiejar
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from enum import Enum from enum import Enum
from peewee import AutoField, Model, CharField, IntegerField, DateField, BooleanField, CompositeKey, DecimalField, ForeignKeyField, SQL from peewee import AutoField, Model, CharField, IntegerField, DateField, BooleanField, CompositeKey, DecimalField, ForeignKeyField, SQL, TextField, TimestampField
import urllib.parse import urllib.parse
logger = logging.getLogger("energaMeter") logger = logging.getLogger("energaMeter")
@@ -31,7 +31,7 @@ class PPETable(Model):
class Meta: class Meta:
database = db database = db
table_name = 'PPE' table_name = 'PPE'
constraints = [SQL('UNIQUE (ppe, tariffCode)')] constraints = [SQL('UNIQUE ("ppe", "tariffCode")')]
class MeterTable(Model): class MeterTable(Model):
id = AutoField() # Meter point id = AutoField() # Meter point
@@ -43,7 +43,7 @@ class MeterTable(Model):
class Meta: class Meta:
database = db database = db
table_name = 'METER' table_name = 'METER'
constraints = [SQL('UNIQUE (ppe_id, meter_type)')] constraints = [SQL('UNIQUE ("ppe_id", "meter_type")')]
class CounterTable(Model): class CounterTable(Model):
id = AutoField() id = AutoField()
@@ -71,7 +71,7 @@ class ChartTable(Model):
year = IntegerField() year = IntegerField()
month = IntegerField(null=True) month = IntegerField(null=True)
day = IntegerField(null=True) day = IntegerField(null=True)
value =CharField() value = TextField()
class Meta: class Meta:
database = db database = db
@@ -82,7 +82,7 @@ class MainChartTable(Model):
mp = CharField() mp = CharField()
meter_type = CharField() meter_type = CharField()
zone = IntegerField() zone = IntegerField()
tm = IntegerField() tm = TimestampField()
value = DecimalField(max_digits=20, decimal_places=16, null=True) value = DecimalField(max_digits=20, decimal_places=16, null=True)
tarAvg = DecimalField(max_digits=20, decimal_places=16, null=True) tarAvg = DecimalField(max_digits=20, decimal_places=16, null=True)
est = BooleanField(default=False) est = BooleanField(default=False)
@@ -360,16 +360,17 @@ class MojLicznik:
try: try:
logger.debug(f"save_main_charts: mp: {mp}, val: {val}, meter_type: {m_type}") logger.debug(f"save_main_charts: mp: {mp}, val: {val}, meter_type: {m_type}")
z = val["zones"] z = val["zones"]
tm = int(val["tm"]) / 1000 # convert JS timestamp (milliseconds) to unix (seconds)
if z[0]: if z[0]:
# MainChartTable.get_or_create(tm = val["tm"], zone = 1, value = z[0], tarAvg=val["tarAvg"], est=val["est"], cplt=val["cplt"]) # MainChartTable.get_or_create(tm = val["tm"], zone = 1, value = z[0], tarAvg=val["tarAvg"], est=val["est"], cplt=val["cplt"])
try: try:
existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == val["tm"]) & (MainChartTable.zone == 1)) existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == tm) & (MainChartTable.zone == 1))
except MainChartTable.DoesNotExist: except MainChartTable.DoesNotExist:
# Jeśli rekord nie istnieje, utwórz nowy # Jeśli rekord nie istnieje, utwórz nowy
MainChartTable.create( MainChartTable.create(
mp=mp, mp=mp,
meter_type=m_type, meter_type=m_type,
tm=val["tm"], tm=tm,
zone=1, zone=1,
value=z[0], value=z[0],
tarAvg=val["tarAvg"], tarAvg=val["tarAvg"],
@@ -379,13 +380,13 @@ class MojLicznik:
if z[1]: if z[1]:
try: try:
existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == val["tm"]) & (MainChartTable.zone == 2)) existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == tm) & (MainChartTable.zone == 2))
except MainChartTable.DoesNotExist: except MainChartTable.DoesNotExist:
# Jeśli rekord nie istnieje, utwórz nowy # Jeśli rekord nie istnieje, utwórz nowy
MainChartTable.create( MainChartTable.create(
mp=mp, mp=mp,
meter_type=m_type, meter_type=m_type,
tm=val["tm"], tm=tm,
zone=2, zone=2,
value=z[1], value=z[1],
tarAvg=val["tarAvg"], tarAvg=val["tarAvg"],
@@ -395,13 +396,13 @@ class MojLicznik:
if z[2]: if z[2]:
try: try:
existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == val["tm"]) & (MainChartTable.zone == 3)) existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == tm) & (MainChartTable.zone == 3))
except MainChartTable.DoesNotExist: except MainChartTable.DoesNotExist:
# Jeśli rekord nie istnieje, utwórz nowy # Jeśli rekord nie istnieje, utwórz nowy
MainChartTable.create( MainChartTable.create(
mp=mp, mp=mp,
meter_type=m_type, meter_type=m_type,
tm=val["tm"], tm=tm,
zone=3, zone=3,
value=z[2], value=z[2],
tarAvg=val["tarAvg"], tarAvg=val["tarAvg"],