2016-11-14 2 views
0

У меня возникают проблемы с подтягиванием пользователя/видео в view_state на основе отношений.Проблема с SQL ALCHEMY отношения (M: 1)

Использование Python 2.7SQLALCHEMY и CRUD method

test.py

def test_crud_operations(): 

    api = ConvenienceAPI() 
    api.create_view_state('module1', 'ack') 
    api.retrieve_view_state('ack') 
    api.update_view_state('ack', 'module1') 

Код:

#base.py 
    class View_State(Base): 
     __tablename__ = 'view_states' 

     id = Column(Integer, primary_key=True) 
     timestamp = Column(DateTime, default=datetime.utcnow) 
     time_update = Column(DateTime, onupdate=datetime.utcnow) 
     completed = Column(Boolean, default=False) #have to set default 

     video_id = Column(Integer, ForeignKey('videos.id')) 
     video = relationship('Video', backref='view_states') 

     user_id = Column(Integer, ForeignKey('users.id')) 
     user = relationship('User', backref='view_states') 

     def __init__(self, video, user): 
      self.completed = False 
      self.video = video 
      self.user = user 

     def __repr__(self): 
      return "<View_State(timestamp='%s', time_update='%s', completed='%s', video='%s', user='%s')>" % (self.timestamp, self.time_update, self.completed, self.video, self.user) 

    #object.py 

     # View State CRUD 

      def update_view_state(self, username, videoname): 
       #update Boolean completed status to 'complete = True' 
       update_completed = self.session.query(View_State).\ 
       filter(View_State.user.has(User.username == username)).\ 
       filter(View_State.video.has(Video.videoname == videoname)).one() 
       print 'retrieved from update complete: ', update_completed 
       if update_completed: 
        completed = True 
        temp = update_completed.completed 
        print 'changed status: ', temp 
        return update_completed 
        self.session.commit() 

    #convenience.py 

     def update_view_state(self, username, videoname): 
      user = self.retrieve_user(username=username) 
      video = self.retrieve_video(videoname) 
      return super(ConvenienceAPI, self).update_view_state(user, video) 

Traceback:

InterfaceError: (sqlite3.InterfaceError) Error binding parameter 0 - probably unsupported type. [SQL: u'SELECT view_states.id AS view_states_id, view_states.timestamp AS view_states_timestamp, view_states.time_update AS view_states_time_update, view_states.completed AS view_states_completed, view_states.video_id AS view_states_video_id, view_states.user_id AS view_states_user_id \nFROM view_states \nWHERE (EXISTS (SELECT 1 \nFROM users \nWHERE users.id = view_states.user_id AND users.username = ?)) AND (EXISTS (SELECT 1 \nFROM videos \nWHERE videos.id = view_states.video_id AND videos.videoname = ?))'] [parameters: (<User(username ='ack', firstname ='A', lastname ='cr', email='[email protected]', institution='foo', residency_year='None')>, <Video(videoname='module1', length='8.0', url='https://vimeo.com/138326103')>)] 

ответ

1

Если вы внимательно посмотрите на сообщение трассировки, вы не отправляете имя пользователя, а класс в качестве параметра, но попробуйте сопоставить его со строкой. Это на самом деле то, что делает ваша программа. вы сначала выбираете класс пользователя и класс видео и передаете эти классы в update_view_state.

Что бы произошло, если бы вы изменили эту линию:

return super(ConvenienceAPI, self).update_view_state(user, video) 

к

return super(ConvenienceAPI, self).update_view_state(user.username, 
                video.videoname) 

Или вы можете изменить update_view_state работать на отношениях вместо:

filter(View_State.user.has(user == username)).\ 
filter(View_State.video.has(video == videoname)).one() 

Hannu

+0

wha t я пытаюсь сделать, это искать по классу (который работает везде), но затем обновить логическое значение в 'view_state' ... Я думаю, что мой код обновления неточен. – thesayhey

+1

Я изменил свой ответ, чтобы включить альтернативу. Параметры имени пользователя и видеоигры называются «неправильными», поскольку вы не отправляете имя, а класс. Тем не менее, эти классы можно сравнить с отношениями в ваших классах данных. – Hannu

+0

это работает! Я хотел сравнить отношения. но теперь передача обновленного булева не работает. можете ли вы взглянуть на код 'update_view_state'? 'ValueError: обнаружен конфликт с двунаправленным атрибутом: передающий объект <Пользователь в 0x108a22550> для атрибута« View_State.video »запускает событие изменения в атрибуте« View_State.user »через backref« User.view_states ». – thesayhey