60 lines
2.8 KiB
Python
60 lines
2.8 KiB
Python
import csv
|
|
from io import StringIO
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
async def get_data_as_csv(cfg: dict, id_recv: int, unit: str, tool: str, matlab_timestamp: float, pool: object) -> str:
|
|
"""
|
|
Retrieves elaborated data from the database and formats it as a CSV string.
|
|
|
|
The query selects data from the `ElabDataView` based on `UnitName`, `ToolNameID`,
|
|
and a `updated_at` timestamp, then orders it. The first row of the CSV will be
|
|
the column headers.
|
|
|
|
Args:
|
|
cfg (dict): Configuration dictionary (not directly used in the query but passed for consistency).
|
|
id (int): The ID of the record being processed (used for logging).
|
|
pool (object): The database connection pool.
|
|
unit (str): The name of the unit to filter the data.
|
|
tool (str): The ID of the tool to filter the data.
|
|
matlab_timestamp (float): A timestamp used to filter data updated after this time.
|
|
|
|
Returns:
|
|
str: A string containing the elaborated data in CSV format.
|
|
"""
|
|
query = """
|
|
select * from (
|
|
select 'ToolNameID', 'EventDate', 'EventTime', 'NodeNum', 'NodeType', 'NodeDepth',
|
|
'XShift', 'YShift', 'ZShift' , 'X', 'Y', 'Z', 'HShift', 'HShiftDir', 'HShift_local',
|
|
'speed', 'speed_local', 'acceleration', 'acceleration_local', 'T_node', 'water_level', 'pressure', 'load_value', 'AlfaX', 'AlfaY', 'CalcErr'
|
|
union all
|
|
select ToolNameID, EventDate, EventTime, NodeNum, NodeType, NodeDepth,
|
|
XShift, YShift, ZShift , X, Y, Z, HShift, HShiftDir, HShift_local,
|
|
speed, speed_local, acceleration, acceleration_local, T_node, water_level, pressure, load_value, AlfaX, AlfaY, calcerr
|
|
from ElabDataView
|
|
where UnitName = %s and ToolNameID = %s and updated_at > %s
|
|
order by ToolNameID DESC, concat(EventDate, EventTime), convert(`NodeNum`, UNSIGNED INTEGER) DESC
|
|
) resulting_set
|
|
"""
|
|
async with pool.acquire() as conn:
|
|
async with conn.cursor() as cur:
|
|
try:
|
|
await cur.execute(query, (unit, tool, matlab_timestamp))
|
|
results = await cur.fetchall()
|
|
logger.info(f"id {id_recv} - {unit} - {tool}: estratti i dati per invio CSV")
|
|
logger.info(f"Numero di righe estratte: {len(results)}")
|
|
|
|
# Creare CSV in memoria
|
|
output = StringIO()
|
|
writer = csv.writer(output, delimiter=",", lineterminator="\n", quoting=csv.QUOTE_MINIMAL)
|
|
for row in results:
|
|
writer.writerow(row)
|
|
csv_data = output.getvalue()
|
|
output.close()
|
|
|
|
return csv_data
|
|
|
|
except Exception as e:
|
|
logger.error(f"id {id_recv} - {unit} - {tool} - errore nel query creazione csv: {e}")
|
|
return None |