2012-08-12 6 views
5

Ich habe folgende Modelle mein Datenbankschema zu beschreiben:sqlalchemy, Attribut: ‚tuple‘ Objekt hat kein Attribut ‚FOREIGN_KEYS‘

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String, ForeignKey 
from sqlalchemy.orm import relationship, backref 
import sqlalchemy.dialects.mysql as mysql 

Base = declarative_base() 

class Country(Base): 
    __tablename__ = 'countries' 
    __table_args__ = { 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8' 
    } 

    id = Column(mysql.TINYINT(unsigned=True), primary_key=True) 
    name = Column(mysql.VARCHAR(30), nullable=False) 
    competitions = relationship('Competition', backref='country') 


class Competition(Base): 
    __tablename__ = 'competitions' 
    __table_args__ = { 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8' 
    } 

    id = Column(mysql.INTEGER(unsigned=True), primary_key=True) 
    name = Column(mysql.VARCHAR(30), nullable=False) 
    country_id = Column(mysql.TINYINT(unsigned=True), ForeignKey('countries.id')) 
    teams = relationship('Team', backref("competition")) 


class Team(Base): 
    __tablename__ = 'teams' 
    __table_args__ = { 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8' 
    } 

    id = Column(mysql.INTEGER(unsigned=True), primary_key=True) 
    name = Column(mysql.VARCHAR(30), nullable=False) 
    competition_id = Column(mysql.INTEGER(unsigned=True), ForeignKey('competitions.id'), nullable=False) 

und wenn ich versuche, ein Team zu schaffen wie:

team = Team() 

erhalte ich die folgenden Zurückverfolgungs nach dem Befehl über:

Traceback (most recent call last): 
    File "/home/giorgos/apps/Aptana_Studio_3/plugins/org.python.pydev_2.6.0.2012062121/pysrc/pydevd.py", line 1392, in <module> 
    debugger.run(setup['file'], None, None) 
    File "/home/giorgos/apps/Aptana_Studio_3/plugins/org.python.pydev_2.6.0.2012062121/pysrc/pydevd.py", line 1085, in run 
    pydev_imports.execfile(file, globals, locals) #execute the script 
    File "/home/giorgos/Documents/Aptana Studio 3 Workspace/BetPick/tests/insert_models.py", line 21, in <module> 
    team = Team() 
    File "<string>", line 2, in __init__ 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/instrumentation.py", line 309, in _new_state_if_none 
    state = self._state_constructor(instance, self) 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 485, in __get__ 
    obj.__dict__[self.__name__] = result = self.fget(obj) 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/instrumentation.py", line 157, in _state_constructor 
    self.dispatch.first_init(self, self.class_) 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/event.py", line 291, in __call__ 
    fn(*args, **kw) 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2342, in _event_on_first_init 
    configure_mappers() 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2258, in configure_mappers 
    mapper._post_configure_properties() 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 1167, in _post_configure_properties 
    prop.init() 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/interfaces.py", line 128, in init 
    self.do_init() 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/properties.py", line 911, in do_init 
    self._determine_joins() 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/properties.py", line 1034, in _determine_joins 
    self.secondary) 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/properties.py", line 1028, in _search_for_join 
    a_subset=mapper.local_table) 
    File "/home/giorgos/.virtualenvs/venv/local/lib/python2.7/site-packages/sqlalchemy/sql/util.py", line 262, in join_condition 
    b.foreign_keys, 
AttributeError: 'tuple' object has no attribute 'foreign_keys' 

, was ich falsch mache?

class Competition(Base): 
    # ... 
    teams = relationship('Team', backref="competition") 

die documentation on relationship Siehe:

+0

Wenn Fehler in Python berichten, ist es immer hilfreich, um die vollständigen Trackbacks in Frage zu stellen . –

Antwort

12

backref sollte ein Schlüsselwort-Argument in Ihrer Erklärung Competition.teams sein. Sie können ein backref callable verwenden, um den Rückverweis ausdrücklich zu konfigurieren, aber Sie würden immer noch das backref Schlüsselwort verwenden müssen:

class Competition(Base): 
    # ... 
    teams = relationship('Team', backref=backref("competition", ... additional keywords ...)) 
Verwandte Themen