Abstract out csv writing

This commit is contained in:
Luke Van Seters 2022-01-03 13:38:34 -05:00
parent 93bdb7c129
commit bab2043575
2 changed files with 33 additions and 27 deletions

View File

@ -1,7 +1,7 @@
import io
from datetime import datetime from datetime import datetime
from typing import Any, List, Optional from typing import List
from mev_inspect.db import write_as_csv
from mev_inspect.schemas.blocks import Block from mev_inspect.schemas.blocks import Block
@ -25,32 +25,15 @@ def delete_blocks(
db_session.commit() db_session.commit()
def clean_csv_value(value: Optional[Any]) -> str:
if value is None:
return r"\N"
return str(value).replace("\n", "\\n")
def write_blocks( def write_blocks(
db_session, db_session,
blocks: List[Block], blocks: List[Block],
) -> None: ) -> None:
csv_file_like_object = io.StringIO() items_generator = (
for block in blocks: (
csv_file_like_object.write( block.block_number,
"|".join( datetime.fromtimestamp(block.block_timestamp),
map(
clean_csv_value,
(
block.block_number,
datetime.fromtimestamp(block.block_timestamp),
),
)
)
+ "\n"
) )
for block in blocks
csv_file_like_object.seek(0) )
write_as_csv(db_session, "blocks", items_generator)
with db_session.connection().connection.cursor() as cursor:
cursor.copy_from(csv_file_like_object, "blocks", sep="|")

View File

@ -1,5 +1,6 @@
import io
import os import os
from typing import Optional from typing import Any, Iterable, Optional
from sqlalchemy import create_engine, orm from sqlalchemy import create_engine, orm
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
@ -63,3 +64,25 @@ def get_trace_session() -> Optional[orm.Session]:
return Session() return Session()
return None return None
def _clean_csv_value(value: Optional[Any]) -> str:
if value is None:
return r"\N"
return str(value).replace("\n", "\\n")
def write_as_csv(
db_session,
table_name: str,
items: Iterable[Iterable[Any]],
) -> None:
csv_file_like_object = io.StringIO()
for item in items:
csv_file_like_object.write("|".join(map(_clean_csv_value, item)) + "\n")
csv_file_like_object.seek(0)
with db_session.connection().connection.cursor() as cursor:
cursor.copy_from(csv_file_like_object, table_name, sep="|")