Re: [sqlalchemy] Dictionaries with mapped objects as keys and integers as values

2017-11-29 Thread Mike Bayer
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.


[sqlalchemy] Dictionaries with mapped objects as keys and integers as values

2017-11-29 Thread Sven
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

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.