On Wed, Nov 29, 2017 at 11:45 AM, Sven wrote:
> Hello everybody,
>
> Is it possible to map dictionaries whose keys are objects and the values
> simple integers?
>
> I have the following case :
>
> In the program, there is one instance of "Options" which contains a
> dictionary. This dictionary has players as keys and integers as values.
> These integers represents the options of the player used as a key.
>
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy import Column, Integer
>
> Base = declarative_base()
>
> class Options(Base):
>
> __tablename__ = "options"
> id = Column(Integer, primary_key=True)
>
> def __init__(self):
> self.options = {} # Player -> Integer
>
> def set_options(self, player, value):
> self.options[player] = value
>
> class Player(Base):
>
> __tablename__ = "players"
> id = Column(Integer, primary_key=True)
>
>
> opt = Options()
>
> john = Player()
> jack = Player()
>
> opt.set_options(john, 2)
> opt.set_options(jack, 5)
>
> print(opt.options)
>
>
> Display :
>
> {<__main__.Player object at 0x05611908>: 5, <__main__.Player object
> at 0x05611860>: 2}
>
> Of course, in this particular case, it doesn't make a lot of sense and it
> could be designed in another way. It is just an example. I have a lot of
> dictionaries with objects as keys in my project and I have no idea how I
> should map these... and curiously, I am not able to find any example on
> Internet.
>
> I found in the SQLAlchemy documentation explanations related to
> mapped_collection and it sounds to be a bit what I'm looking for.
>
>> sqlalchemy.orm.collections.mapped_collection(keyfunc)
>> "A dictionary-based collection type with arbitrary keying."
>
>
> http://docs.sqlalchemy.org/en/latest/orm/collections.html
>
> The Composite Association example seems also to be a good base to do what I
> want :
>
> http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html#composite-association-proxy
that example might even be too complicated, but sure you need to use
the association proxy whenever you want a collection of scalar
(non-object) values. It looks like you have an association table
implied so here is a demo of what you request:
class Options(Base):
__tablename__ = "options"
id = Column(Integer, primary_key=True)
def __init__(self):
self.options = {}
def set_options(self, player, value):
self.options[player] = value
player_assoc = relationship(
"PlayerOptAssoc",
collection_class=attribute_mapped_collection("player"))
options = association_proxy(
"player_assoc", "int_value",
creator=lambda key, value: PlayerOptAssoc(player=key, int_value=value))
class PlayerOptAssoc(Base):
__tablename__ = "player_opt_assoc"
player_id = Column(ForeignKey('players.id'), primary_key=True)
option_id = Column(ForeignKey('options.id'), primary_key=True)
player = relationship("Player")
int_value = Column(Integer)
class Player(Base):
__tablename__ = "players"
id = Column(Integer, primary_key=True)
opt = Options()
john = Player()
jack = Player()
opt.set_options(john, 2)
opt.set_options(jack, 5)
print(opt.options)
does the output:
{<__main__.Player object at 0x7fbcb361f090>: 2, <__main__.Player
object at 0x7fbcb361fe10>: 5}
>
> Do you have suggestions ? Is it even possible ? What would be the good
> method to map that ?
>
> 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 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.