On Fri, Oct 20, 2017 at 2:40 PM, Sven <[email protected]> wrote:
> Thank you for your answer.
>
> I'm sorry, I have not been clear enough regarding the "__abstract__ = True".
>
> I suppose that I will have to add this to a lot of classes for the following
> reasons :
> 1) because it will allow me to persist the classes one by one and still be
> able to run and test the project (i will not have all the errors because
> there is no table name and no primary key). So, I would have to delete the
> "__abstract__" when I begin to work on the persistence of a new class.
> 2) because I thought that the best solution in this case is to map only the
> concrete classes. So, in my example, I would have to map "Player" and "NPC",
> but not "Character". So only the classes at the bottom of the hierarchy
> would have to be mapped. That's still a lot of classes but probably easier
> to implement.

OK, so I see you are looking to add something like "Mappable" or
similar only to those classes that are concrete.

how about this?

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


class MetaBase(type):

    def __init__(cls, nom, bases, contenu):
        type.__init__(cls, nom, bases, contenu)
        print("Init MetaBase")
        pass


class DeclMetaBase(MetaBase, DeclarativeMeta):

    def __init__(cls, nom, bases, contenu):
        super(MetaBase, cls).__init__(nom, bases, contenu)
        print("Init DeclMetaBase")

Base = declarative_base(metaclass=DeclMetaBase)


class Stockable(metaclass=MetaBase):

    def __init__(self):
        print("Init Stockable")


class Character(Stockable, Base):

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

    def __init__(self, name):
        self.name = name
        print("Init character")

print(repr(Character.__table__))
jean = Character("Jean")
print(jean.name)



>
> But I have to say that this is not absolutely clear for me for now. This is
> the first time I use SQLAlchemy. Do you think that this method is possible
> and is the right way to proceed ?



Whether or not it "works" involves mostly the database schema that
gets created and how reasonable this schema is from a relational /
database performance / complexity perspective.   This depends a lot on
how these class hierarchies are organized and how they interact with
each other, so it's difficult to say.



>
> Le vendredi 20 octobre 2017 20:02:40 UTC+2, Mike Bayer a écrit :
>>
>>
>> CONTINUING !  sorry
>>
>>
>> On Fri, Oct 20, 2017 at 11:55 AM, Sven Dumay <[email protected]> wrote:
>>>
>>>
>>> I tried other things and I found the following solution :
>>>
>>> from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta
>>> from sqlalchemy import Column, Integer
>>>
>>> class MetaBase(DeclarativeMeta):
>>>
>>>     def __init__(cls, nom, bases, contenu):
>>>         super(MetaBase, cls).__init__(nom, bases, contenu)
>>>         print("Init MetaBase")
>>>
>>> Base = declarative_base(metaclass = MetaBase)
>>>
>>> class Stockable(Base):
>>>
>>>     __abstract__ = True
>>>
>>>     def __init__(self):
>>>         print("Init Stockable")
>>>
>>> class Character(Stockable):
>>>
>>>     __tablename__ = 'characters'
>>>     id = Column(Integer, primary_key=True)
>>>
>>>     def __init__(self, name):
>>>         self.name = name
>>>         print("Init character")
>>>
>>>
>>> jean = Character("Jean")
>>> print(jean.name)
>>>
>>>
>>
>> this seems like roughly the correct approach.
>>
>>>
>>> It seems to work. I get the following result :
>>>
>>> >>>
>>> Init MetaBase
>>> Init MetaBase
>>> Init MetaBase
>>> Init compte
>>> Jean
>>> >>>
>>>
>>> However, the problem with this method is that I have to add "__abstract__
>>> = True" to every class which is inherited by Stockable... so, about 400
>>> classes.
>>
>>
>> I don't see why that is.  If these classes are mapped to tables (which, if
>> they are persisted, they are), then there is no reason to add
>> "__abstract__".        As in my previous email, how these 400 classes link
>> to tables is what needs to be answered and then we can formulate the correct
>> calling style.
>>
>>
>>>
>>> It is not very clean. Is it possible to avoid that by using something
>>> similar to my first code ? It would be great !
>>>
>>> Thank you very much.
>>>
>>> Sven
>>>
>>> --
>>> 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 [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at https://groups.google.com/group/sqlalchemy.
>>> For more options, visit https://groups.google.com/d/optout.
>>
>>
> --
> 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to