improved handling of empty DB; "tables,py" now contains verbatim code from sqlacodegen, eliminating the need for code reformatting

This commit is contained in:
eclipse 2025-07-17 09:45:23 +02:00
parent a607b8c4f3
commit 93198254f6
2 changed files with 49 additions and 40 deletions

View File

@ -5,14 +5,21 @@ db = SQLAlchemy()
def init_db(app): def init_db(app):
db.init_app(app) db.init_app(app)
with app.app_context(): with app.app_context():
print(f"number of db tables is {len(db.metadata.tables)}") # check if database is empty and if so, populate it with fresh tables
#TODO: does it make sense to try and create all tables by default? Existing tables wouldn't be overwritten but what about DB constraints ?
# populate an empty DB with fresh tables
#TODO: maybe add tables to metadata in any case since tables won't get overwritten
if not len(db.metadata.tables): if not len(db.metadata.tables):
from the_works.tables import add_tables # import table classes from code that was generated via `sqlacodegen --generator tables sqlite:///the_works.sqlite > ./the_works/tables.py` in project root
add_tables(db.metadata) import the_works.tables
db.metadata.create_all(db.engine)
print(f"and now number of db tables is {len(db.metadata.tables)}")
# filter the objects just imported for those of type sqlalchemy.Table
from sqlalchemy import Table
table_list = list(filter(lambda t: type(t) == Table, vars(the_works.tables).values()))
# Table objects imported from sqlacodegen code are associated with a random MetaData() object, so we have to re-associate them with the DB's metadata
table_list = list(map(lambda t: t.to_metadata(db.metadata), table_list))
# create tables in DB )
db.metadata.create_all(db.engine)
# generate declarative table objects by reflecting the DB
db.reflect() db.reflect()

View File

@ -1,39 +1,41 @@
# File content is based on the output of `sqlacodegen --generator tables sqlite:///path/to/the_works.sqlite` # file created via `sqlacodegen --generator tables sqlite:///path/to/the_works.sqlite > tables.py`
from sqlalchemy import Column, ForeignKey, Integer, LargeBinary, MetaData, Table, Text from sqlalchemy import Column, ForeignKey, Integer, LargeBinary, MetaData, Table, Text
def add_tables(metadata): metadata = MetaData()
t_Genre = Table(
t_Genre = Table(
'Genre', metadata, 'Genre', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Genre', Text, nullable=False) Column('Genre', Text, nullable=False)
) )
t_Herausgeber = Table( t_Herausgeber = Table(
'Herausgeber', metadata, 'Herausgeber', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Name', Text, nullable=False) Column('Name', Text, nullable=False)
) )
t_Pseudonym = Table( t_Pseudonym = Table(
'Pseudonym', metadata, 'Pseudonym', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Pseudonym', Text, nullable=False) Column('Pseudonym', Text, nullable=False)
) )
t_Sprache = Table( t_Sprache = Table(
'Sprache', metadata, 'Sprache', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Sprache', Text, nullable=False) Column('Sprache', Text, nullable=False)
) )
t_Textform = Table( t_Textform = Table(
'Textform', metadata, 'Textform', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Textform', Text, nullable=False) Column('Textform', Text, nullable=False)
) )
t_Titelbild = Table( t_Titelbild = Table(
'Titelbild', metadata, 'Titelbild', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Mimetype', Text, nullable=False), Column('Mimetype', Text, nullable=False),
@ -44,28 +46,28 @@ def add_tables(metadata):
Column('Bild', LargeBinary, nullable=False), Column('Bild', LargeBinary, nullable=False),
Column('Thumbnail', LargeBinary, nullable=False), Column('Thumbnail', LargeBinary, nullable=False),
Column('sha256', Text, nullable=False, unique=True) Column('sha256', Text, nullable=False, unique=True)
) )
t_Verlag = Table( t_Verlag = Table(
'Verlag', metadata, 'Verlag', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Verlag', Text, nullable=False) Column('Verlag', Text, nullable=False)
) )
t_Werksform = Table( t_Werksform = Table(
'Werksform', metadata, 'Werksform', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Werksform', Text, nullable=False) Column('Werksform', Text, nullable=False)
) )
t_Reihe = Table( t_Reihe = Table(
'Reihe', metadata, 'Reihe', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Titel', Text, nullable=False), Column('Titel', Text, nullable=False),
Column('Verlag', ForeignKey('Verlag.ID')) Column('Verlag', ForeignKey('Verlag.ID'))
) )
t_Text = Table( t_Text = Table(
'Text', metadata, 'Text', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Titel', Text, nullable=False), Column('Titel', Text, nullable=False),
@ -73,9 +75,9 @@ def add_tables(metadata):
Column('Reihe', ForeignKey('Reihe.ID')), Column('Reihe', ForeignKey('Reihe.ID')),
Column('Textform', ForeignKey('Textform.ID')), Column('Textform', ForeignKey('Textform.ID')),
Column('Sprache', ForeignKey('Sprache.ID')) Column('Sprache', ForeignKey('Sprache.ID'))
) )
t_Werk = Table( t_Werk = Table(
'Werk', metadata, 'Werk', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Titel', Text, nullable=False), Column('Titel', Text, nullable=False),
@ -92,15 +94,15 @@ def add_tables(metadata):
Column('Titelbild', ForeignKey('Titelbild.ID')), Column('Titelbild', ForeignKey('Titelbild.ID')),
Column('Klappentext', Text), Column('Klappentext', Text),
Column('Anmerkungen', Text) Column('Anmerkungen', Text)
) )
t_Text_Genre = Table( t_Text_Genre = Table(
'Text_Genre', metadata, 'Text_Genre', metadata,
Column('Text', ForeignKey('Text.ID'), primary_key=True), Column('Text', ForeignKey('Text.ID'), primary_key=True),
Column('Genre', ForeignKey('Genre.ID'), primary_key=True) Column('Genre', ForeignKey('Genre.ID'), primary_key=True)
) )
t_Veroeffentlichung = Table( t_Veroeffentlichung = Table(
'Veroeffentlichung', metadata, 'Veroeffentlichung', metadata,
Column('ID', Integer, primary_key=True), Column('ID', Integer, primary_key=True),
Column('Text', ForeignKey('Text.ID'), nullable=False), Column('Text', ForeignKey('Text.ID'), nullable=False),
@ -108,16 +110,16 @@ def add_tables(metadata):
Column('AltTitel', Text), Column('AltTitel', Text),
Column('AltUntertitel', Text), Column('AltUntertitel', Text),
Column('Pseudonym', ForeignKey('Pseudonym.ID'), nullable=False) Column('Pseudonym', ForeignKey('Pseudonym.ID'), nullable=False)
) )
t_Werk_Genre = Table( t_Werk_Genre = Table(
'Werk_Genre', metadata, 'Werk_Genre', metadata,
Column('Werk', ForeignKey('Werk.ID'), primary_key=True), Column('Werk', ForeignKey('Werk.ID'), primary_key=True),
Column('Genre', ForeignKey('Genre.ID'), primary_key=True) Column('Genre', ForeignKey('Genre.ID'), primary_key=True)
) )
t_Werk_Herausgeber = Table( t_Werk_Herausgeber = Table(
'Werk_Herausgeber', metadata, 'Werk_Herausgeber', metadata,
Column('Herausgeber', ForeignKey('Herausgeber.ID'), primary_key=True), Column('Herausgeber', ForeignKey('Herausgeber.ID'), primary_key=True),
Column('Werk', ForeignKey('Werk.ID'), primary_key=True) Column('Werk', ForeignKey('Werk.ID'), primary_key=True)
) )