From e86e432102bd3482e69b51819938e90260c9ef18 Mon Sep 17 00:00:00 2001 From: "Waylon S. Walker" Date: Thu, 22 Jun 2023 16:02:03 -0500 Subject: [PATCH] wip --- learn_sql_model/cli/model.py | 27 +++- learn_sql_model/er_diagram.py | 151 ++++++++++++++++++ learn_sql_model/models/hero.py | 25 ++- migrations/script.py.mako | 5 + ..._y_size.py => 3555f61aaa79_add_x_and_y.py} | 19 ++- .../versions/3555f61aaa79_er_diagram.md | 68 ++++++++ .../versions/3555f61aaa79_er_diagram.png | Bin 0 -> 39552 bytes .../versions/79972ec5f79d_er_diagram.md | 65 ++++++++ .../versions/79972ec5f79d_er_diagram.png | Bin 0 -> 35288 bytes ...516c888495_init.py => 79972ec5f79d_int.py} | 32 ++-- .../versions/a9bb6625c57b_add_birthday.py | 29 ---- 11 files changed, 352 insertions(+), 69 deletions(-) create mode 100644 learn_sql_model/er_diagram.py rename migrations/versions/{e26398d96dd0_add_x_y_size.py => 3555f61aaa79_add_x_and_y.py} (55%) create mode 100644 migrations/versions/3555f61aaa79_er_diagram.md create mode 100644 migrations/versions/3555f61aaa79_er_diagram.png create mode 100644 migrations/versions/79972ec5f79d_er_diagram.md create mode 100644 migrations/versions/79972ec5f79d_er_diagram.png rename migrations/versions/{c8516c888495_init.py => 79972ec5f79d_int.py} (66%) delete mode 100644 migrations/versions/a9bb6625c57b_add_birthday.py diff --git a/learn_sql_model/cli/model.py b/learn_sql_model/cli/model.py index eb5ea67..8937ef3 100644 --- a/learn_sql_model/cli/model.py +++ b/learn_sql_model/cli/model.py @@ -1,4 +1,5 @@ from pathlib import Path +from typing import Annotated import alembic from alembic.config import Config @@ -6,6 +7,7 @@ import copier import typer from learn_sql_model.cli.common import verbose_callback +from learn_sql_model.config import get_config model_app = typer.Typer() @@ -40,11 +42,18 @@ def create_revision( callback=verbose_callback, help="show the log messages", ), - message: str = typer.Option( - prompt=True, - ), + message: Annotated[ + str, + typer.Option( + "--message", + "-m", + prompt=True, + ), + ] = None, ): alembic_cfg = Config("alembic.ini") + config = get_config() + alembic_cfg.set_main_option("sqlalchemy.url", config.database_url) alembic.command.revision( config=alembic_cfg, message=message, @@ -63,7 +72,17 @@ def checkout( revision: str = typer.Option("head"), ): alembic_cfg = Config("alembic.ini") - alembic.command.upgrade(config=alembic_cfg, revision="head") + config = get_config() + alembic_cfg.set_main_option("sqlalchemy.url", config.database_url) + alembic.command.upgrade(config=alembic_cfg, revision=revision) + + +@model_app.command() +def status(): + alembic_cfg = Config("alembic.ini") + config = get_config() + alembic_cfg.set_main_option("sqlalchemy.url", config.database_url) + alembic.command.current(config=alembic_cfg) @model_app.command() diff --git a/learn_sql_model/er_diagram.py b/learn_sql_model/er_diagram.py new file mode 100644 index 0000000..4a48fa5 --- /dev/null +++ b/learn_sql_model/er_diagram.py @@ -0,0 +1,151 @@ +import sqlite3 + +from graphviz import Digraph + +from learn_sql_model.config import get_config + +config = get_config() + + +def generate_er_diagram(output_path): + # Connect to the SQLite database + database_path = config.database_url.replace("sqlite:///", "") + conn = sqlite3.connect(database_path) + cursor = conn.cursor() + + # Get the table names from the database + cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") + tables = cursor.fetchall() + + # Create a new Digraph + dot = Digraph(format="png") + dot.attr(rankdir="TD") + + # Iterate over the tables + for table in tables: + table_name = table[0] + dot.node(table_name, shape="box") + cursor.execute(f"PRAGMA table_info({table_name});") + columns = cursor.fetchall() + + # Add the columns to the table node + for column in columns: + column_name = column[1] + dot.node(f"{table_name}.{column_name}", label=column_name, shape="oval") + dot.edge(table_name, f"{table_name}.{column_name}") + + # Check for foreign key relationships + cursor.execute(f"PRAGMA foreign_key_list({table_name});") + foreign_keys = cursor.fetchall() + + # Add dotted lines for foreign key relationships + for foreign_key in foreign_keys: + from_column = foreign_key[3] + to_table = foreign_key[2] + to_column = foreign_key[4] + dot.node(f"{to_table}.{to_column}", shape="oval") + dot.edge( + f"{table_name}.{from_column}", f"{to_table}.{to_column}", style="dotted" + ) + + # Render and save the diagram + dot.render(output_path.replace(".png", ""), cleanup=True) + + # Close the database connection + cursor.close() + conn.close() + + +def generate_er_markdown(output_path, er_diagram_path): + # Connect to the SQLite database + database_path = config.database_url.replace("sqlite:///", "") + conn = sqlite3.connect(database_path) + cursor = conn.cursor() + + # Get the table names from the database + cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") + tables = cursor.fetchall() + + with open(output_path, "w") as f: + # Write the ER Diagram image + f.write(f"![ER Diagram]({er_diagram_path})\n\n---\n\n") + + # Iterate over the tables + for table in tables: + table_name = table[0] + + f.write(f"## Table: {table_name}\n\n") + + # Get the table columns + cursor.execute(f"PRAGMA table_info({table_name});") + columns = cursor.fetchall() + + f.write("### First 5 rows\n\n") + cursor.execute(f"SELECT * FROM {table_name} LIMIT 5;") + rows = cursor.fetchall() + f.write(f'| {" | ".join([c[1] for c in columns])} |\n') + f.write("|") + for column in columns: + # --- + f.write(f'{"-"*(len(column[1]) + 2)}|') + f.write("\n") + for row in rows: + f.write(f'| {" | ".join([str(r) for r in row])} |\n') + f.write("\n") + + cursor.execute(f"PRAGMA foreign_key_list({table_name});") + foreign_keys = cursor.fetchall() + + # Add dotted lines for foreign key relationships + fkeys = {} + for foreign_key in foreign_keys: + from_column = foreign_key[3] + to_table = foreign_key[2] + to_column = foreign_key[4] + fkeys[from_column] = f"{to_table}.{to_column}" + + # Replace 'description' with the actual column name in the table that contains the description, if applicable + try: + cursor.execute(f"SELECT description FROM {table_name} LIMIT 1;") + description = cursor.fetchone() + if description: + f.write(f"### Description\n\n{description[0]}\n\n") + except: + ... + + # Write the table columns + f.write("### Columns\n\n") + f.write("| Column Name | Type | Foreign Key | Example Value |\n") + f.write("|-------------|------|-------------|---------------|\n") + + for column in columns: + + column_name = column[1] + column_type = column[2] + fkey = "" + if column_name in fkeys: + fkey = fkeys[column_name] + f.write(f"| {column_name} | {column_type} | {fkey} | | |\n") + + f.write("\n") + + # Get the count of records + cursor.execute(f"SELECT COUNT(*) FROM {table_name};") + records_count = cursor.fetchone()[0] + f.write( + f"### Records Count\n\nThe table {table_name} contains {records_count} records.\n\n---\n\n" + ) + + # Close the database connection + cursor.close() + conn.close() + + +if __name__ == "__main__": + # Usage example + database_path = "database.db" + md_output_path = "database.md" + er_output_path = "er_diagram.png" + + generate_er_diagram(database_path, er_output_path) + generate_markdown(database_path, md_output_path, er_output_path) diff --git a/learn_sql_model/models/hero.py b/learn_sql_model/models/hero.py index 14e17b1..5d40c07 100644 --- a/learn_sql_model/models/hero.py +++ b/learn_sql_model/models/hero.py @@ -2,10 +2,9 @@ from typing import Dict, Optional import httpx from pydantic import BaseModel -from sqlmodel import Field, Relationship, SQLModel +from sqlmodel import Field, SQLModel from learn_sql_model.config import config -from learn_sql_model.models.pet import Pet class HeroBase(SQLModel, table=False): @@ -13,12 +12,12 @@ class HeroBase(SQLModel, table=False): secret_name: str x: int y: int - size: int - age: Optional[int] = None - shoe_size: Optional[int] = None + # size: int + # age: Optional[int] = None + # shoe_size: Optional[int] = None - pet_id: Optional[int] = Field(default=None, foreign_key="pet.id") - pet: Optional[Pet] = Relationship(back_populates="hero") + # pet_id: Optional[int] = Field(default=None, foreign_key="pet.id") + # pet: Optional[Pet] = Relationship(back_populates="hero") class Hero(HeroBase, table=True): @@ -73,13 +72,13 @@ class HeroUpdate(SQLModel): # all other fields, must match the model, but with Optional default None name: Optional[str] = None secret_name: Optional[str] = None - age: Optional[int] = None - shoe_size: Optional[int] = None - x: Optional[int] - y: Optional[int] + # age: Optional[int] = None + # shoe_size: Optional[int] = None + # x: Optional[int] + # y: Optional[int] - pet_id: Optional[int] = Field(default=None, foreign_key="pet.id") - pet: Optional[Pet] = Relationship(back_populates="hero") + # pet_id: Optional[int] = Field(default=None, foreign_key="pet.id") + # pet: Optional[Pet] = Relationship(back_populates="hero") def update(self) -> Hero: r = httpx.patch( diff --git a/migrations/script.py.mako b/migrations/script.py.mako index 3124b62..567e915 100644 --- a/migrations/script.py.mako +++ b/migrations/script.py.mako @@ -8,6 +8,9 @@ Create Date: ${create_date} from alembic import op import sqlalchemy as sa import sqlmodel +from learn_sql_model.er_diagram import generate_er_diagram, generate_er_markdown +from learn_sql_model.config import get_config + ${imports if imports else ""} # revision identifiers, used by Alembic. @@ -19,6 +22,8 @@ depends_on = ${repr(depends_on)} def upgrade() -> None: ${upgrades if upgrades else "pass"} + generate_er_diagram(f'migrations/versions/{revision}_er_diagram.png') + generate_er_markdown(f'migrations/versions/{revision}_er_diagram.md', f'migrations/versions/er_diagram_{revision}.png') def downgrade() -> None: diff --git a/migrations/versions/e26398d96dd0_add_x_y_size.py b/migrations/versions/3555f61aaa79_add_x_and_y.py similarity index 55% rename from migrations/versions/e26398d96dd0_add_x_y_size.py rename to migrations/versions/3555f61aaa79_add_x_and_y.py index 4219bde..0ff42c5 100644 --- a/migrations/versions/e26398d96dd0_add_x_y_size.py +++ b/migrations/versions/3555f61aaa79_add_x_and_y.py @@ -1,18 +1,21 @@ -"""add x, y, size +"""add x and y -Revision ID: e26398d96dd0 -Revises: a9bb6625c57b -Create Date: 2023-06-10 18:37:04.751553 +Revision ID: 3555f61aaa79 +Revises: 79972ec5f79d +Create Date: 2023-06-22 15:03:27.338959 """ from alembic import op import sqlalchemy as sa import sqlmodel +from learn_sql_model.er_diagram import generate_er_diagram, generate_er_markdown +from learn_sql_model.config import get_config + # revision identifiers, used by Alembic. -revision = 'e26398d96dd0' -down_revision = 'a9bb6625c57b' +revision = '3555f61aaa79' +down_revision = '79972ec5f79d' branch_labels = None depends_on = None @@ -21,13 +24,13 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.add_column('hero', sa.Column('x', sa.Integer(), nullable=False)) op.add_column('hero', sa.Column('y', sa.Integer(), nullable=False)) - op.add_column('hero', sa.Column('size', sa.Integer(), nullable=False)) # ### end Alembic commands ### + generate_er_diagram(f'migrations/versions/{revision}_er_diagram.png') + generate_er_markdown(f'migrations/versions/{revision}_er_diagram.md', f'migrations/versions/er_diagram_{revision}.png') def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('hero', 'size') op.drop_column('hero', 'y') op.drop_column('hero', 'x') # ### end Alembic commands ### diff --git a/migrations/versions/3555f61aaa79_er_diagram.md b/migrations/versions/3555f61aaa79_er_diagram.md new file mode 100644 index 0000000..caf6156 --- /dev/null +++ b/migrations/versions/3555f61aaa79_er_diagram.md @@ -0,0 +1,68 @@ +![ER Diagram](migrations/versions/er_diagram_3555f61aaa79.png) + +--- + +## Table: learn_sql_model_alembic_version + +### First 5 rows + +| version_num | +|-------------| +| 79972ec5f79d | + +### Columns + +| Column Name | Type | Foreign Key | Example Value | +|-------------|------|-------------|---------------| +| version_num | VARCHAR(32) | | | | + +### Records Count + +The table learn_sql_model_alembic_version contains 1 records. + +--- + +## Table: hero + +### First 5 rows + +| name | secret_name | id | x | y | +|------|-------------|----|---|---| + +### Columns + +| Column Name | Type | Foreign Key | Example Value | +|-------------|------|-------------|---------------| +| name | VARCHAR | | | | +| secret_name | VARCHAR | | | | +| id | INTEGER | | | | +| x | INTEGER | | | | +| y | INTEGER | | | | + +### Records Count + +The table hero contains 0 records. + +--- + +## Table: pet + +### First 5 rows + +| name | birthday | id | +|------|----------|----| + +### Columns + +| Column Name | Type | Foreign Key | Example Value | +|-------------|------|-------------|---------------| +| name | VARCHAR | | | | +| birthday | DATETIME | | | | +| id | INTEGER | | | | + +### Records Count + +The table pet contains 0 records. + +--- + diff --git a/migrations/versions/3555f61aaa79_er_diagram.png b/migrations/versions/3555f61aaa79_er_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..7c6bdabb7b386deb4c48ebc70307375d92812eb2 GIT binary patch literal 39552 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 literal 0 HcmV?d00001 diff --git a/migrations/versions/79972ec5f79d_er_diagram.md b/migrations/versions/79972ec5f79d_er_diagram.md new file mode 100644 index 0000000..9f3ece5 --- /dev/null +++ b/migrations/versions/79972ec5f79d_er_diagram.md @@ -0,0 +1,65 @@ +![ER Diagram](migrations/versions/er_diagram_79972ec5f79d.png) + +--- + +## Table: learn_sql_model_alembic_version + +### First 5 rows + +| version_num | +|-------------| + +### Columns + +| Column Name | Type | Foreign Key | Example Value | +|-------------|------|-------------|---------------| +| version_num | VARCHAR(32) | | | | + +### Records Count + +The table learn_sql_model_alembic_version contains 0 records. + +--- + +## Table: hero + +### First 5 rows + +| name | secret_name | id | +|------|-------------|----| + +### Columns + +| Column Name | Type | Foreign Key | Example Value | +|-------------|------|-------------|---------------| +| name | VARCHAR | | | | +| secret_name | VARCHAR | | | | +| id | INTEGER | | | | + +### Records Count + +The table hero contains 0 records. + +--- + +## Table: pet + +### First 5 rows + +| name | birthday | id | +|------|----------|----| + +### Columns + +| Column Name | Type | Foreign Key | Example Value | +|-------------|------|-------------|---------------| +| name | VARCHAR | | | | +| birthday | DATETIME | | | | +| id | INTEGER | | | | + +### Records Count + +The table pet contains 0 records. + +--- + diff --git a/migrations/versions/79972ec5f79d_er_diagram.png b/migrations/versions/79972ec5f79d_er_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4f37b565cf6f0fdd8b4b2197cca1a3a0663dc7 GIT binary patch literal 35288 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%0ApZIg0KHM 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 None: # ### commands auto generated by Alembic - please adjust! ### - op.create_table('pet', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.PrimaryKeyConstraint('id') - ) op.create_table('hero', - sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column('secret_name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column('age', sa.Integer(), nullable=True), - sa.Column('shoe_size', sa.Integer(), nullable=True), - sa.Column('pet_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint(['pet_id'], ['pet.id'], ), + sa.Column('id', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('pet', + sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('birthday', sa.DateTime(), nullable=True), + sa.Column('id', sa.Integer(), nullable=False), sa.PrimaryKeyConstraint('id') ) # ### end Alembic commands ### + generate_er_diagram(f'migrations/versions/{revision}_er_diagram.png') + generate_er_markdown(f'migrations/versions/{revision}_er_diagram.md', f'migrations/versions/er_diagram_{revision}.png') def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('hero') op.drop_table('pet') + op.drop_table('hero') # ### end Alembic commands ### diff --git a/migrations/versions/a9bb6625c57b_add_birthday.py b/migrations/versions/a9bb6625c57b_add_birthday.py deleted file mode 100644 index 9e8feb4..0000000 --- a/migrations/versions/a9bb6625c57b_add_birthday.py +++ /dev/null @@ -1,29 +0,0 @@ -"""add birthday - -Revision ID: a9bb6625c57b -Revises: c8516c888495 -Create Date: 2023-05-25 19:00:58.137464 - -""" -from alembic import op -import sqlalchemy as sa -import sqlmodel - - -# revision identifiers, used by Alembic. -revision = 'a9bb6625c57b' -down_revision = 'c8516c888495' -branch_labels = None -depends_on = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('pet', sa.Column('birthday', sa.DateTime(), nullable=True)) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('pet', 'birthday') - # ### end Alembic commands ###