sqlalchemy-同一个表的两个不同字段中的一对一关系与不同的表

sqlalchemy-同一个表的两个不同字段中的一对一关系与不同的表,sqlalchemy,Sqlalchemy,我遇到了这个问题:我有两个表,一个叫做团队,另一个叫做事件。问题是,我希望这两个表之间有一对一的关系,但是,在事件表中,我希望在两个字段中有这样的关系,一个称为home(主队),另一个称为away(客场)team 但是,sqlalchemy正在抱怨我做错了什么,我不知道是什么,错误是:«ArgumentError:在关系“Event.away_team”上创建backref“Event”时出错:映射器“mapper | team | bt_team”上存在该名称的属性。我可能做错了什么?这是我的

我遇到了这个问题:我有两个表,一个叫做团队,另一个叫做事件。问题是,我希望这两个表之间有一对一的关系,但是,在事件表中,我希望在两个字段中有这样的关系,一个称为home(主队),另一个称为away(客场)team

但是,sqlalchemy正在抱怨我做错了什么,我不知道是什么,错误是:«ArgumentError:在关系“Event.away_team”上创建backref“Event”时出错:映射器“mapper | team | bt_team”上存在该名称的属性。我可能做错了什么?这是我的模型:

#!/usr/bin/env python2
# coding: utf-8
#                        VENI, SANCTE SPIRITUS

import sqlalchemy
import common_models
import datetime


class Team(common_models.Base):

    """ Database table for soccer teams
    """
    __tablename__ = "bt_team"
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(30), unique=True)
    monitored_since = sqlalchemy.Column(
        sqlalchemy.DateTime, default=datetime.datetime.utcnow)

    # Huh, another field is not required?
    event_id = sqlalchemy.Column(
        sqlalchemy.Integer, sqlalchemy.ForeignKey("bt_event.id"))

    def __repr__(self):
        return "<Team {}>".format(self.name)


class Event(common_models.Base):

    """ Database table for the events
    """
    __tablename__ = "bt_event"
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
    home_team = sqlalchemy.orm.relationship(
        "Team", uselist=False, backref="Event")
    away_team = sqlalchemy.orm.relationship(
        "Team", uselist=False, backref="Event")
    # the "1" in the bet board
    home_wins = sqlalchemy.Column(sqlalchemy.String(7), nullable=True)
    # the "2" in the bet board
    away_wins = sqlalchemy.Column(sqlalchemy.String(7), nullable=True)
    # the "X" in the bet board
    draw = sqlalchemy.Column(sqlalchemy.String(7), nullable=True)
    # when will this event start? (and any bet can be made)
    event_date = sqlalchemy.Column(sqlalchemy.DateTime, nullable=True)
    # when was the last time this event was scraped?
    updated = sqlalchemy.Column(
        sqlalchemy.DateTime, nullable=True)

    def __repr__(self):
        return "<Event {} v {} ({} UK): 1 {} - X {} - 2 {}>".format(
            self.home_team.name, self.away_team.name,
            self.event_date.strftime("%d %B %H:%M"),
            self.home_wins, self.draw, self.away_wins)

    def get_match_teams(self):
        """ Return a string with the teams names which is the event name
        """
        return "{} v {}".format(self.home_team.name,
                                self.away_team.name)
#/usr/bin/env蟒蛇2
#编码:utf-8
#维尼,精神健全
进口炼金术
导入通用模型
导入日期时间
班级团队(通用模型库):
“”足球队的数据库表
"""
__tablename=“bt\u团队”
id=sqlalchemy.Column(sqlalchemy.Integer,主键=True)
name=sqlalchemy.Column(sqlalchemy.String(30),unique=True)
监视的\u自=sqlalchemy.Column(
sqlalchemy.DateTime,默认值=DateTime.DateTime.utcnow)
#嗯,不需要另一个字段?
event_id=sqlalchemy.Column(
sqlalchemy.Integer,sqlalchemy.ForeignKey(“bt_event.id”))
定义报告(自我):
返回“”。格式(self.name)
类事件(公共_models.Base):
“”事件的数据库表
"""
__tablename=“bt\u事件”
id=sqlalchemy.Column(sqlalchemy.Integer,主键=True)
home\u team=sqlalchemy.orm.relationship(
“团队”,uselist=False,backref=“事件”)
客场团队=sqlalchemy.orm.relationship(
“团队”,uselist=False,backref=“事件”)
#赌板上的“1”
home\u wins=sqlalchemy.Column(sqlalchemy.String(7),nullable=True)
#赌板上的“2”
away\u wins=sqlalchemy.Column(sqlalchemy.String(7),nullable=True)
#赌板上的“X”
draw=sqlalchemy.Column(sqlalchemy.String(7),nullable=True)
#这个活动什么时候开始?(并且可以进行任何打赌)
event_date=sqlalchemy.Column(sqlalchemy.DateTime,nullable=True)
#这一事件最后一次被取消是什么时候?
updated=sqlalchemy.Column(
sqlalchemy.DateTime,null=True)
定义报告(自我):
返回“”格式(
self.home\u team.name,self.away\u team.name,
self.event_date.strftime(“%d%B%H:%M”),
赛尔夫。主场胜利,赛尔夫。平局,赛尔夫。客场胜利)
def get_match_团队(自我):
“”“返回一个字符串,该字符串包含作为事件名称的团队名称。”
"""
返回“{}v{}”。格式(self.home_team.name,
赛尔夫(客场球队名称)
下面是全部错误:

E
======================================================================
ERROR: Get the bets for the next two soccer plays
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/nose/case.py", line 267, in setUp
    try_run(self.test, names)
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/nose/util.py", line 470, in try_run
    return func()
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/tests/test_bets.py", line 46, in s
    team1 = betevent_models.Team(name="FK Krasnodar")
  File "<string>", line 2, in __init__
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/instrumentation.py", line 324, in _new_state_if_none                                                                                                                 
    state = self._state_constructor(instance, self)
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 725, in __get__                                                                                                                               
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/instrumentation.py", line 158, in _state_constructor                                                                                                                 
    self.dispatch.first_init(self, self.class_)
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/event/attr.py", line 260, in __call__                                                                                                                                    
    fn(*args, **kw)
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2687, in _event_on_first_init                                                                                                                       
    configure_mappers()
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2583, in configure_mappers                                                                                                                          
    mapper._post_configure_properties()
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 1688, in _post_configure_properties                                                                                                                 
    prop.init()
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/interfaces.py", line 144, in
 init                                                                                                                                    
    self.do_init()
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1553, in do_init                                                                                                                             
    self._generate_backref()
  File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1743, in _generate_backref                                                                                                                   
    (backref_key, self, m))
ArgumentError: Error creating backref 'Event' on relationship 'Event.away_team': property of that name exists on mapper 'Mapper|Team|bt_team'
E
======================================================================
错误:为接下来的两场足球比赛下注
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/nose/case.py”,第267行,在设置中
try_run(self.test,name)
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/nose/util.py”,第470行,在try_run中
返回func()
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/tests/tests_bets.py”,第46行,s
team1=betevent\u models.Team(name=“FK Krasnodar”)
文件“”,第2行,在_init中__
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/sqlalchemy/orm/instrumentation.py”,第324行,处于“新”状态
state=self.\u state\u构造函数(实例,self)
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/sqlalchemy/util/langhelpers.py”,第725行,在
obj.\uuuuu dict\uuuuu[self.\uuuuuuuuuuu name\uuuuuuuuu]=结果=self.fget(obj)
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/sqlalchemy/orm/instrumentation.py”,第158行,处于“状态”
self.dispatch.first_init(self,self.class_)
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/sqlalchemy/event/attr.py”,第260行,在
fn(*参数,**千瓦)
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/sqlalchemy/orm/mapper.py”,第2687行,第一次事件
配置映射器()
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/sqlalchemy/orm/mapper.py”,第2583行,在configure_mappers中
映射程序。_post_configure_properties()
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/sqlalchemy/orm/mapper.py”,第1688行,在“后期配置”属性中
prop.init()
文件“/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site packages/sqlalchemy/orm/interfaces.py”,第144行
初始化
from sqlalchemy import Column, ForeignKey, Integer, String, create_engine
from sqlalchemy.orm import relationship, Session
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Team(Base):
    __tablename__ = 'team'

    id = Column(Integer, primary_key=True)
    name = Column(String)


class Event(Base):
    __tablename__ = 'event'

    id = Column(Integer, primary_key=True)
    home_id = Column(ForeignKey('team.id'))
    away_id = Column(ForeignKey('team.id'))

    home_team = relationship("Team", foreign_keys=home_id)
    away_team = relationship("Team", foreign_keys=away_id)

e = create_engine("sqlite://", echo=True)
Base.metadata.create_all(e)

sess = Session(e)

t1, t2, t3, t4 = (
    Team(name='t1'), Team(name='t2'),
    Team(name='t3'), Team(name='t4')
)

sess.add_all([t1, t2, t3, t4])

sess.add_all([
    Event(home_team=t1, away_team=t2),
    Event(home_team=t3, away_team=t1),
    Event(home_team=t2, away_team=t4)
])

sess.commit()