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)
negative = request.args.get('negative', type=bool, default=False)
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}")
factor = 1
if negative:
@@ -226,13 +226,13 @@ def charts():
charts = []
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 = {
'mp': p.mp,
'meter_type': p.meter_type,
'meter_type_url': urllib.parse.quote_plus(p.meter_type),
'zone': p.zone,
'time_tm': p.tm,
'time_tm': int(p.tm.timestamp()*1000),
'time': czas,
'value': p.value * factor
}

View File

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