I'm changing my framework to use the SQLAlchemy declarative system 
internally. However, I want to keep the API the same. Here is how users of 
my framework declare a foreign key:

from myframework import Model, Link

class Bar(Model)

class Foo(Model):
  bar = Link(Bar)

At first I thought I could simply change the implementation of Link to this:

def Link(cls):
  return relationship(cls.__name__)

But actually I see that in SQLAlchemy I also need an Integer column that 
contains the id. So, I think I would need to patch the class at runtime to 
ensure these 2 attributes are defined. First, I would make a simple 
definition of Link to store the class it points to:

class Link:
  def __init__(self, cls):
    self.cls = cls

Then after I import the user's module, I patch all subclasses of Model:

for cls in Model.__subclasses__():
    for k, v in list(cls.__dict__.items()):
        if isinstance(v, Link):
            ClsName = v.cls.__name__
            setattr(cls, k, relationship(f'{cls.__module__}.{ClsName}'))
            setattr(
                cls,
                f'{k}_id',
                Column(
                    Integer,
                    ForeignKey(f'{cls.__tablename__}_{ClsName.lower()}.id'),
                ),
            )

However, I get this:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 
'live_bid.player_id' could not find table 'live_bid_player' with which to 
generate a foreign key to target column 'id'

I guess I am patching it too late. My next idea is to put this patching 
code inside the metaclass of Model, but before I go too far down the wrong 
path I wanted to ask here if there is a better way :)

Thank you!

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/ee6e67c2-331c-490b-bc66-b91c796b50f6n%40googlegroups.com.

Reply via email to