I am using SQLAlchemy + sqlacodegen in my python project. I have succesfully generated declarative model from my database, which looks like this:
DB_Model.py
from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, Table
from sqlalchemy.sql.sqltypes import NullType
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
metadata = Base.metadata
class GameMatch(Base):
__tablename__ = 'GameMatches'
GameMatch_ID = Column(Integer, primary_key=True)
MatchDate = Column(DateTime)
UserCreated = Column(String(100))
class Player(Base):
__tablename__ = 'Players'
Player_ID = Column(Integer, primary_key=True)
Name = Column(String(255))
RollPerRound = Column(Integer)
class User(Base):
__tablename__ = 'Users'
User_ID = Column(Integer, primary_key=True)
Name = Column(String(255), nullable=False)
Code generating:
import io
import sys
import os
from sqlalchemy import create_engine, MetaData
from sqlacodegen.codegen import CodeGenerator
def generate_model(host, user, password, database, outfile = None):
engine = create_engine('sqlite:///' + os.getcwd() + "\\PigGameDB.db")
metadata = MetaData(bind=engine)
metadata.reflect()
outfile = io.open(outfile, 'w', encoding='utf-8') if outfile else sys.stdout
generator = CodeGenerator(metadata)
generator.render(outfile)
if __name__ == '__main__':
generate_model('database.example.org', 'dbuser', 'secretpassword', 'mydatabase', 'DB_Model.py')
I want to add functionality for these classes, but I can't add it directly into this model, because I have decided for Database first aproach - I define the database first, and then I use sqlacodegen to update the model. That means, that the model file is always rewritten with new generation.
I am thinking about using inheritance for these classes (wrapper) with desired functionality, or switch approach to code first (which i really not prefer).
What are the possible solutions for this problem? Links to good articles are welcomed too. As far as i know, in Python is no equivalent of partial class like in C#, which is solution for EntityFramework's database first approach.
Also is good approach to use these model classes directly in my project, or should I implement some mapping?
For example having class Player and _Player:
Player - class for table in the database, and used only for access to database.
_Player - class for the project itself, like standard python class.
Python 3.11.4 SQLAlchemy 1.4.49 sqlacodegen 2.3.0.post1
I tried searching for partial class C# equivalent for Python, with expectation, that class is divided to 2 sections - generated and written by hand.