Skip to content

Commit

Permalink
Support Date, LargeBinary and Float columns
Browse files Browse the repository at this point in the history
  • Loading branch information
Iain-S committed Jan 3, 2023
1 parent 3f01dca commit b3e3a0a
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 72 deletions.
10 changes: 7 additions & 3 deletions sqlsynthgen/create_generators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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)
Expand Down Expand Up @@ -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"
)

Expand Down
2 changes: 1 addition & 1 deletion sqlsynthgen/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
20 changes: 19 additions & 1 deletion sqlsynthgen/providers.py
Original file line number Diff line number Diff line change
@@ -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."""
Expand All @@ -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")
61 changes: 16 additions & 45 deletions tests/examples/example_tables.py
Original file line number Diff line number Diff line change
@@ -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)
34 changes: 12 additions & 22 deletions tests/examples/expected_output.py
Original file line number Diff line number Diff line change
@@ -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,
]

0 comments on commit b3e3a0a

Please sign in to comment.