when you have CharacterEntity, would there also be MonsterCharacterEntity, FaunaCharacterEntity, etc. ? if you had "Monster", "Fauna", "Race", "Foliage" mixins that are applied to the LivingEntity hierarchy that would be a place to hold your "species_lookup" relationship. What is the base of the hierarchy of RaceLookup/MonsterLookup/FaunaLookup/FoliageLookup? there should be some common term for that too like TaxonomyLookup or something. since we are heavy with entity terminology here.
On Thu, Apr 5, 2018 at 8:52 AM, Johnathan Norton <ancientradiostat...@gmail.com> wrote: > Disclaimer: I'm very new at this. Only been learning databases for a couple > weeks, and been working with python for about a month and 1/2. I did do > several searches, phrasing things differently, but I can't seem to find my > answer. > > I'm trying to build a overly complex DnD database and cmdline program to GM > with. > Current issue is that I'm playing with a lot of mixin classes, creating new > tables for more and more complex entities so I'm not having simple > entities(less columns) waste space in the same table with complex ones(more > columns). > > For instance: > LivingEntity table has current_hp, max_hp, and base_ac columns. > StattedEntity would inherit those from LivingEntity and gain attributes that > ready it for combat: str, dex, con, etc... > > I'm trying to add a piece of functionality to the LivingEntity class that > gets passed down to its children. I want all children entity tables to have > two columns. > - One column is the entity's species type (Foliage, Fauna, Monster, > Race) > - The other column takes that type and goes to a table with that type in > the name, and uses the second column's entry as a foreign key for that > column. > > When I create an entity, I'd like to be able to give a function a string. It > searches through the fauna, foliage, monster, and race tables for that > string, and when it finds it, fills in the species_id, and species_type > columns appropriately. > Finally, I want to be able to query the foliage, fauna, monster, and race > tables to get general information about trees, deer, beholders, or humans. > > Code: (Bolded text is my main focus atm.) > > class Entity(): > __tablename__ = 'Entity' > > id > name > description > parent_campaign > > class LivingEntity(Entity): > """Parent class for statted entities. Mainly basic metadata about > generic living creatures that won't be in combat.""" > __tablename__ = 'LivingEntities' > > @declared_attr > def species_type(cls): > return Column('species_type', ForeignKey('SpeciesLookup.name'), > nullable=False) > > @declared_attr > def species_id(cls): > Column('species_id', ForeignKey(f'{species_type}Lookup.id')) > #species_type is out of scope here, yes? > > current_hp = Column(Integer, nullable=False) > max_hp = Column(Integer, nullable=False) > base_ac = Column(Integer, nullable=False) > > @declared_attr > def SpeciesLookup(cls): > return relationship('SpeciesLookup') > > @declared_attr > def I_don't_even_know_how_to_begin_to_define_this_relationship(cls): > return relationship(f'{species_type}Lookup') > > > class StattedEntity(LivingEntity): > """Parent class for monster, character, and player tables. Adds combat > and hex map functionality.""" > __tablename__ = 'StattedEntity' > > level > armor_ac_bonus > init_bonus > initiative > speed > etc... > > class SentientEntity(): > """Parent class for any entities needing sentient functionality.""" > __tablename__ = 'SentientEntity' > > alignment > religion > behaviors > current_goal > fears > > class CharacterEntity(StattedEntity, SentientEntity, Base): > """Holds instances of simple NPCs.""" > profession > talents > brief_backstory > party > stress > main_goal > > class PlayerEntity(StattedEntity, SentientEntity, Base): > """Holds instances of player characters.""" > class_id > backstory_file > storybook_file > wis_save > cha_save > athletics > acrobatics > sleight_of_hand > stealth > location > etc... > > class SpeciesLookup(Entity, Base): > """Lookup table for species types.""" > __tablename__ = 'SpeciesLookup' > > class FoliageLookup(Entity, Base): > """lookup table for all foliage species""" > __tablename__ = 'FoliageLookup' > specific_attribute_1 > specific_attribute_3 > > class FaunaLookup(Entity, Base): > """Lookup table for all innocent fauna""" > __tablename__ = 'FaunaLookup' > specific_attribute_5 > specific_attribute_2 > > class MonsterLookup(Entity, Base): > """Lookup table for all monsters, beasts""" > __tablename__ = 'MonsterLookup' > specific_attribute_7 > specific_attribute_6 > > class RaceLookup(Entity, Base): > """lookup table for all races""" > __tablename__ = 'RaceLookup' > specific_attribute_9 > specific_attribute_11 > > -- > 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 post to this group, send email to sqlalchemy@googlegroups.com. > 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.