diff --git a/alembic/env.py b/alembic/env.py index 82bf6e0..7966288 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -1,81 +1,49 @@ from logging.config import fileConfig -from sqlalchemy import engine_from_config +from sqlalchemy import create_engine from sqlalchemy import pool from alembic import context from sqlmodel import SQLModel + +from etl.transform.preSiteNoteTypes import * + import os # this is the Alembic Config object, which provides # access to the values within the .ini file in use. +# Load DB URL from env var db_url = os.getenv("DATABASE_URL") +if not db_url: + raise RuntimeError("Please set DATABASE_URL") if not db_url: raise RuntimeError("Please specify database url via DATABASE_URL in env variable") +import logging +logging.basicConfig(level=logging.INFO) + config = context.config -config.set_main_option("sqlalchemy.url", db_url) - - -# Interpret the config file for Python logging. -# This line sets up loggers basically. -if config.config_file_name is not None: - fileConfig(config.config_file_name) - -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata target_metadata = SQLModel.metadata -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. - - def run_migrations_offline() -> None: - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ - url = config.get_main_option("sqlalchemy.url") context.configure( - url=url, + url=db_url, target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}, ) - with context.begin_transaction(): context.run_migrations() + def run_migrations_online() -> None: - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - - """ - connectable = engine_from_config( - config.get_section(config.config_ini_section, {}), - prefix="sqlalchemy.", - poolclass=pool.NullPool, - ) - - with connectable.connect() as connection: + engine = create_engine(db_url, poolclass=pool.NullPool) + with engine.connect() as connection: context.configure( - connection=connection, target_metadata=target_metadata + connection=connection, + target_metadata=target_metadata, ) - with context.begin_transaction(): context.run_migrations() diff --git a/alembic/versions/e351a98aba54_init_some_tables.py b/alembic/versions/e351a98aba54_init_some_tables.py new file mode 100644 index 0000000..43be0da --- /dev/null +++ b/alembic/versions/e351a98aba54_init_some_tables.py @@ -0,0 +1,117 @@ +"""init some tables + +Revision ID: e351a98aba54 +Revises: +Create Date: 2025-05-08 06:52:41.139547 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +import sqlmodel + + +# revision identifiers, used by Alembic. +revision: str = 'e351a98aba54' +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('companyinfo', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('trading_name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('post_code', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('fax_number', sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column('related_party_disclosure', sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('heatingsystemcontrols', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('control_type', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('flue_type', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('fan_assisted_flue', sa.Boolean(), nullable=False), + sa.Column('heat_emitter_type', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('electricity_meter_type', sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column('mains_gas_available', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('heatingtype', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('heating_type', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('fuel_type', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('presitenotessummaryinfo', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('reference_number', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('epc_language', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('uprn', sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column('postcode', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('region', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('address', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('town', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('county', sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column('property_tenure', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('transaction_type', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('inspection_date', sa.DateTime(), nullable=False), + sa.Column('current_sap', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('potential_sap', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('current_ei', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('potential_ei', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('current_annual_emissions', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('current_annual_emission_including_0925_multiplayer', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('current_annual_energy_costs', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('assessorinfo', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('accreditation_number', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('phone_number', sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column('email_address', sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column('company_id', sa.Uuid(), nullable=False), + sa.ForeignKeyConstraint(['company_id'], ['companyinfo.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('heating', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('type', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('heating_source', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('efficiency_source', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('heating_fuel', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('brand_name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('model_name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('model_qualifer', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('sap_2009_table', sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column('percentage_of_heated_floor_area_served', sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column('controls_id', sa.Uuid(), nullable=False), + sa.ForeignKeyConstraint(['controls_id'], ['heatingsystemcontrols.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('presitenote', + sa.Column('id', sa.Uuid(), nullable=False), + sa.Column('summary_info_id', sa.Uuid(), nullable=False), + sa.Column('assessor_id', sa.Uuid(), nullable=False), + sa.ForeignKeyConstraint(['assessor_id'], ['assessorinfo.id'], ), + sa.ForeignKeyConstraint(['summary_info_id'], ['presitenotessummaryinfo.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('presitenote') + op.drop_table('heating') + op.drop_table('assessorinfo') + op.drop_table('presitenotessummaryinfo') + op.drop_table('heatingtype') + op.drop_table('heatingsystemcontrols') + op.drop_table('companyinfo') + # ### end Alembic commands ### diff --git a/migration_db.sh b/migration_db.sh index b46bc72..d029b60 100644 --- a/migration_db.sh +++ b/migration_db.sh @@ -1,2 +1,2 @@ -poetry run alembic revision --autogenerate -m "some msg" -#poetry upgrade head +#poetry run alembic revision --autogenerate -m "init some tables" +poetry run alembic upgrade head