Question

I'm using python-storm as orm. The many-to-many reference set is giving me headaches :(

These are the relevant objects:

class Author(object):
    __storm_table__ = "author"
    id = Int(primary=True)
    name = Unicode()
    institution_id = Int()
    institution = Reference(institution_id, Institution.id)

    def __init__(self, name):
        self.name = name


class Paper(object):
    __storm_table__ = "paper"
    id = Int(primary=True)
    name = Unicode()
    conference_id = Int()
    conference = Reference(conference_id, Conference.id)

    def __init__(self, name):
        self.name = name

class AuthorPapers(object):
    __storm_table__ = "authorpapers"
    __storm_primary__ = "author_id", "paper_id"
    author_id = Int()
    paper_id = Int()

The respective sqlite table look like this

store.execute("CREATE TABLE if not exists author (id INTEGER PRIMARY KEY, name VARCHAR, institution_id INTEGER, FOREIGN KEY (institution_id) REFERENCES institution(id))")

store.execute("CREATE TABLE if not exists paper (id INTEGER PRIMARY KEY, name VARCHAR, conference_id INTEGER, FOREIGN KEY (conference_id) REFERENCES conference(id))")

store.execute("CREATE TABLE if not exists authorpapers (author_id INTEGER, paper_id INTEGER, PRIMARY KEY (author_id, paper_id))")

Now say if a have two author the collaborated on a paper

a = Author(u"Steve Rogers")
b = Author(u"Captain America")

and a paper

p6 = Paper(u"Bunga Bunga")

So now I want to associate both author to the paper using

Author.papers = ReferenceSet(Author.id, AuthorPapers.author_id, Paper.id, AuthorPapers.paper_id)

and doing this

a.papers.add(p6)
b.papers.add(p6)

This is btw it says it is supposed to work in the storm tutorial...but I get

  File "/usr/lib64/python2.7/site-packages/storm/references.py", line 376, in add
    self._relation2.link(remote, link, True)
  File "/usr/lib64/python2.7/site-packages/storm/references.py", line 624, in link
    pairs = zip(self._get_local_columns(local.__class__),
  File "/usr/lib64/python2.7/site-packages/storm/references.py", line 870, in _get_local_columns
    for prop in self.local_key)
  File "/usr/lib64/python2.7/site-packages/storm/references.py", line 870, in <genexpr>
    for prop in self.local_key)
  File "/usr/lib64/python2.7/site-packages/storm/properties.py", line 53, in __get__
    return self._get_column(cls)
  File "/usr/lib64/python2.7/site-packages/storm/properties.py", line 97, in _get_column
    attr = self._detect_attr_name(cls)
  File "/usr/lib64/python2.7/site-packages/storm/properties.py", line 82, in _detect_attr_name
    raise RuntimeError("Property used in an unknown class")
RuntimeError: Property used in an unknown class

And I'm not really able to make sense of this right now.

Was it helpful?

Solution

I'm not really, familiar with storm, but looking at the documentation example, looks like is just an issue related to the order in which the arguments to ReferenceSet are passed. I tried to use this:

Author.papers = ReferenceSet(Author.id, AuthorPapers.author_id, AuthorPapers.paper_id, Paper.id)

instead of this:

Author.papers = ReferenceSet(Author.id, AuthorPapers.author_id, Paper.id, AuthorPapers.paper_id)

and no exception was raised.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top