Python Forum
SQL Alchemy dynamic class - declarative_base losing attributes
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
SQL Alchemy dynamic class - declarative_base losing attributes
#1
Hi,

Based on below posts
- dynamic-schema
- Dynamic Class Creation in SQLAlchemy

I wanted to make similar thing in my project. I use declarative_base class for core ORM models stored in db_models.py, additionally depends on user settings I want to create and store dynamic classes in BASE._dec_class_registry (db_manage.py>LotteryDatabase>_initial_database>create_class_model) those dynamic classes vary depends on params combinations from games_config.py.
My problem is when the first create_class_model method is called it's correctly adding class to BASE._dec_class_registry, but when calling next one BASE "losing" first class and adding new one and so on. When BASE.metadata.create_all() is called all tables are created in schema, but I can't access this dynamic classes using LotteryDatabase>set_model_by_table_name.

I tried doing it with raw test example:

models.py

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Integer, Column

BASE = declarative_base()


class NewClass(BASE):

    __tablename__ = 'test'

    id = Column('id', Integer, primary_key=True)
test.py

from models import *
from sqlalchemy import create_engine

DB_ENGINE = 'sqlite:///my_db.db'


def main():

    engine = create_engine(DB_ENGINE)

    BASE.metadata.create_all(engine)

    input_params = {'__tablename__': 'test1',
                    'id': Column('id', Integer, primary_key=True)}

    _ = type('InputClass', (BASE,), input_params)

    model_params = {'__tablename__': 'test2',
                    'id': Column('id', Integer, primary_key=True)}

    _ = type('ModelClass', (BASE,), model_params)

    predict_params = {'__tablename__': 'test3',
                      'id': Column('id', Integer, primary_key=True)}

    _ = type('PredictClass', (BASE,), predict_params)

    BASE.metadata.create_all(engine)
All classes where created and added to BASE, so problem is with my code and I am missing something. Your fresh look would be very helpful!
Application is fully operational and including requirements.txt file for packages.

For better inside what I am talking about, step by step example using debug mode. (look image below)

I have rewrote code so all class attributes are stored in dictionary and then used in creating models.

-->>[Image: view?usp=sharing]
Reply
#2
you might find this useful: https://blog.miguelgrinberg.com/post/the...v-database
also: https://docs.pylonsproject.org/projects/...base-class
Reply
#3
your sample code puts the classes in _decl_class_registry fine, below is your code with the classes being retrieved:


from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Integer, Column

BASE = declarative_base()


class NewClass(BASE):

__tablename__ = 'test'

id = Column('id', Integer, primary_key=True)


input_params = {'__tablename__': 'test1',
'id': Column('id', Integer, primary_key=True)}

_ = type('InputClass', (BASE,), input_params)

model_params = {'__tablename__': 'test2',
'id': Column('id', Integer, primary_key=True)}

_ = type('ModelClass', (BASE,), model_params)

predict_params = {'__tablename__': 'test3',
'id': Column('id', Integer, primary_key=True)}

_ = type('PredictClass', (BASE,), predict_params)


input_class = BASE._decl_class_registry["InputClass"]
model_class = BASE._decl_class_registry["ModelClass"]
predict_class = BASE._decl_class_registry["PredictClass"]

from sqlalchemy.orm import Session
print(Session().query(predict_class))
I don't have the resources to go looking at your full application but the basic idea works, if you need help with your app see if you can find folks on the IRC channel to take a look for you, or otherwise try to reverse your code back to the sample above to see what's different.
Reply
#4
@LeanbridgeTech

Thanks for that! We are looking at this with SQL ALchemy team to resolve that. Once we find solution will post it here!
Reply
#5
SQL Alchemy team found problem. BASE._dec_class_registry losing attributes due to multithreading. As a solution for that I create global DYNAMIC_CLASS and store all _ = type(class_name, (BASE,), params) and call it on run. BASE._dec_class_registry don't losing attributes then
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
Question [solved] Classes, assign an attributes to a class not to instances.. SpongeB0B 4 891 May-20-2023, 04:08 PM
Last Post: SpongeB0B
  SQL Alchemy help to extract sql data into csv files mg24 1 1,678 Sep-30-2022, 04:43 PM
Last Post: Larz60+
  [Solved] Novice question to OOP: can a method of class A access attributes of class B BigMan 1 1,267 Mar-14-2022, 11:21 PM
Last Post: deanhystad
Question I am struggling with basic json library + sql alchemy w/ mariadb-connector json ->sql BrandonKastning 0 1,483 Mar-04-2022, 09:26 PM
Last Post: BrandonKastning
  Distinguishing different types of class attributes Drone4four 4 2,054 Feb-21-2022, 06:34 PM
Last Post: deanhystad
  Environment seems to keep losing references spacedog 2 1,869 Apr-23-2021, 07:36 PM
Last Post: spacedog
  Calls to Attributes of a Class SKarimi 3 3,338 Apr-22-2021, 04:18 PM
Last Post: SKarimi
  losing memory antioch 1 1,735 Jan-20-2021, 05:29 AM
Last Post: antioch
  Winning/Losing Message Error in Text based Game kdr87 2 2,927 Dec-14-2020, 12:25 AM
Last Post: bowlofred
  how to add class instance attributes from list 999masks 2 2,661 Jul-22-2019, 07:59 AM
Last Post: 999masks

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020