diff --git a/sqlsynthgen/create_generators.py b/sqlsynthgen/create_generators.py index 638b86a..5bdfff7 100644 --- a/sqlsynthgen/create_generators.py +++ b/sqlsynthgen/create_generators.py @@ -9,15 +9,16 @@ '"""This file was auto-generated by sqlsynthgen but can be edited manually."""', "from mimesis import Generic", "from mimesis.locales import Locale", - "from sqlsynthgen.providers import ForeignKeyProvider", + "from sqlsynthgen.providers import BinaryProvider, ForeignKeyProvider", "", "generic = Generic(locale=Locale.EN)", "generic.add_provider(ForeignKeyProvider)", + "generic.add_provider(BinaryProvider)", "", ) ) -INDENTATION: Final[str] = " " +INDENTATION: Final[str] = " " * 4 def create_generators_from_tables(tables_module_name: str) -> str: @@ -39,8 +40,11 @@ def create_generators_from_tables(tables_module_name: str) -> str: sqltypes.BigInteger: "generic.numeric.integer_number()", sqltypes.Boolean: "generic.development.boolean()", sqltypes.DateTime: "generic.datetime.datetime()", + sqltypes.Date: "generic.datetime.date()", sqltypes.Integer: "generic.numeric.integer_number()", sqltypes.Text: "generic.text.color()", + sqltypes.Float: "generic.numeric.float_number()", + sqltypes.LargeBinary: "generic.binary_provider.bytes()", } tables_module = importlib.import_module(tables_module_name) @@ -79,7 +83,7 @@ def create_generators_from_tables(tables_module_name: str) -> str: + "self." + column.name + " = " - + sql_to_mimesis_map.get(type(column.type), "-1") + + sql_to_mimesis_map[type(column.type)] + "\n" ) diff --git a/sqlsynthgen/main.py b/sqlsynthgen/main.py index fe50d3e..391ce86 100644 --- a/sqlsynthgen/main.py +++ b/sqlsynthgen/main.py @@ -19,7 +19,7 @@ def main() -> None: def generate(sorted_tables: list, sorted_generators: list) -> Any: - """Connect to a database and""" + """Connect to a database and populate it with data.""" settings = get_settings() engine = create_engine(settings.postgres_dsn) diff --git a/sqlsynthgen/providers.py b/sqlsynthgen/providers.py index ee45e17..b8e5e31 100644 --- a/sqlsynthgen/providers.py +++ b/sqlsynthgen/providers.py @@ -1,9 +1,14 @@ """This module contains Mimesis Provider sub-classes.""" from typing import Any -from mimesis.providers.base import BaseProvider +from mimesis import Text +from mimesis.providers.base import BaseDataProvider, BaseProvider + +# from mimesis.locales import Locale from sqlalchemy.sql import text +# generic = Generic(locale=Locale.EN) + class ForeignKeyProvider(BaseProvider): """A Mimesis provider of foreign keys.""" @@ -18,3 +23,16 @@ def key(self, db_connection: Any, schema: str, table: str, column: str) -> Any: query_str = f"SELECT {column} FROM {schema}.{table} ORDER BY random() LIMIT 1" key = db_connection.execute(text(query_str)).fetchone()[0] return key + + +class BinaryProvider(BaseDataProvider): + """A Mimesis provider of binary data.""" + + class Meta: + """Meta-class for ForeignKeyProvider settings.""" + + name = "binary_provider" + + def bytes(self) -> bytes: + """Return a UTF-8 encoded sentence.""" + return Text(self.locale).sentence().encode("utf-8") diff --git a/tests/examples/example_tables.py b/tests/examples/example_tables.py index b25982f..950ba69 100644 --- a/tests/examples/example_tables.py +++ b/tests/examples/example_tables.py @@ -1,66 +1,37 @@ # coding: utf-8 -from sqlalchemy import BigInteger, Boolean, Column, ForeignKey, Integer, DateTime, Text +from sqlalchemy import BigInteger, Boolean, Column, ForeignKey, Integer, DateTime, Text, Date, Float, LargeBinary from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship Base = declarative_base() metadata = Base.metadata -class Mrn(Base): - __tablename__ = "mrn" - __table_args__ = {"schema": "star"} +class Person(Base): + __tablename__ = "person" + __table_args__ = {"schema": "myschema"} - mrn_id = Column( + person_id = Column( Integer, primary_key=True, - # server_default=text("nextval('star.mrn_mrn_id_seq'::regclass)"), ) - mrn = Column(Text) + name = Column(Text) nhs_number = Column(Text) research_opt_out = Column(Boolean) source_system = Column(Text) stored_from = Column(DateTime(True)) -class LabSample(Base): - __tablename__ = "lab_sample" - __table_args__ = {"schema": "star"} +class HopsitalVisit(Base): + __tablename__ = "hospital_visit" + __table_args__ = {"schema": "myschema"} - lab_sample_id = Column( - Integer, - primary_key=True, - # server_default=text("nextval('star.lab_sample_lab_sample_id_seq'::regclass)"), - ) - mrn_id = Column(ForeignKey("star.mrn.mrn_id")) - external_lab_number = Column(Text) - receipt_at_lab_datetime = Column(DateTime(True)) - sample_collection_datetime = Column(DateTime(True)) - specimen_type = Column(Text) - sample_site = Column(Text) - collection_method = Column(Text) - valid_from = Column(DateTime(True)) - stored_from = Column(DateTime(True)) - - mrn = relationship("Mrn") - - -class AdvanceDecision(Base): - __tablename__ = "advance_decision" - __table_args__ = {"schema": "star"} - - advance_decision_id = Column( - Integer, + hospital_visit_id = Column( + BigInteger, primary_key=True, - # server_default=text( - # "nextval('star.advance_decision_advance_decision_id_seq'::regclass)" - # ), ) - advance_decision_type_id = Column(BigInteger) - # hospital_visit_id = Column(BigInteger) - # internal_id = Column(BigInteger) - status_change_datetime = Column(DateTime(True)) - # requested_datetime = Column(DateTime(True)) - # valid_from = Column(DateTime(True)) - # stored_from = Column(DateTime(True)) + person_id = Column(ForeignKey("myschema.person.person_id")) + visit_start = Column(DateTime(True)) + visit_end = Column(Date) + visit_duration_seconds = Column(Float) + visit_image = Column(LargeBinary) diff --git a/tests/examples/expected_output.py b/tests/examples/expected_output.py index e1945f4..ca4a00f 100644 --- a/tests/examples/expected_output.py +++ b/tests/examples/expected_output.py @@ -1,42 +1,32 @@ """This file was auto-generated by sqlsynthgen but can be edited manually.""" from mimesis import Generic from mimesis.locales import Locale -from sqlsynthgen.providers import ForeignKeyProvider +from sqlsynthgen.providers import BinaryProvider, ForeignKeyProvider generic = Generic(locale=Locale.EN) generic.add_provider(ForeignKeyProvider) +generic.add_provider(BinaryProvider) -class advance_decisionGenerator: +class personGenerator: def __init__(self, db_connection): - self.advance_decision_type_id = generic.numeric.integer_number() - self.status_change_datetime = generic.datetime.datetime() - - -class mrnGenerator: - def __init__(self, db_connection): - self.mrn = generic.text.color() + self.name = generic.text.color() self.nhs_number = generic.text.color() self.research_opt_out = generic.development.boolean() self.source_system = generic.text.color() self.stored_from = generic.datetime.datetime() -class lab_sampleGenerator: +class hospital_visitGenerator: def __init__(self, db_connection): - self.mrn_id = generic.foreign_key_provider.key(db_connection, "star", "mrn", "mrn_id") - self.external_lab_number = generic.text.color() - self.receipt_at_lab_datetime = generic.datetime.datetime() - self.sample_collection_datetime = generic.datetime.datetime() - self.specimen_type = generic.text.color() - self.sample_site = generic.text.color() - self.collection_method = generic.text.color() - self.valid_from = generic.datetime.datetime() - self.stored_from = generic.datetime.datetime() + self.person_id = generic.foreign_key_provider.key(db_connection, "myschema", "person", "person_id") + self.visit_start = generic.datetime.datetime() + self.visit_end = generic.datetime.date() + self.visit_duration_seconds = generic.numeric.float_number() + self.visit_image = generic.binary_provider.bytes() sorted_generators = [ - advance_decisionGenerator, - mrnGenerator, - lab_sampleGenerator, + personGenerator, + hospital_visitGenerator, ]