【问题标题】:deleting element from table in sql-alchemy从 sql-alchemy 中的表中删除元素
【发布时间】:2015-10-24 10:18:42
【问题描述】:

我正在尝试删除 flask-sqlalchemy 中的表条目,但出现以下错误。

AttributeError: 'Join' object has no attribute 'delete'

(我在下面包含了整个错误消息)。我要删除的表是

class Groups(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    leader_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    name = db.Column(db.String(1000))
    start_datetime = db.Column(db.DateTime)
    email_notification = db.Column(db.String(6))
    member_count = db.Column(db.Integer)
    new_member_confirmed = db.Column(db.SmallInteger)
    next_jc = db.Column(db.DateTime)
    last_jc = db.Column(db.DateTime)
    meeting_location = db.Column(db.String(1000))
    meeting_time = db.Column(db.DateTime)
    meeting_period = db.Column(db.String(10))
    meeting_timezone = db.Column(db.String(1000))
    meeting_weekday = db.Column(db.String(1000))

    vote_list = db.relationship('Papers',
                            secondary="join(Papers, VoteList, Papers.arxiv_id == VoteList.arxiv_id)",
                            primaryjoin="and_(Groups.id == VoteList.group_id)") 
    members = db.relationship('User',
                          secondary="join(Members, User, User.id == Members.user_id)",
                          primaryjoin="and_(Groups.id == Members.group_id)") 

    def __repr__(self):
        return '<Groups %r>' % (self.id)

以下是在其中发挥作用的其他表

class VoteList(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    group_id = db.Column(db.Integer, db.ForeignKey('groups.id'))
    arxiv_id = db.Column(db.String(1000), db.ForeignKey('papers.arxiv_id'))
    vote_datetime = db.Column(db.DateTime)

    def __repr__(self):
        return '<VoteList %r>' % (self.id)

class Members(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    group_id = db.Column(db.Integer, db.ForeignKey('groups.id'))

    def __repr__(self):
         return '<Members %r>' % (self.id)

class User(db.Model):
    __searchable__ = ['username','email','position','institute','id']

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    start_datetime = db.Column(db.DateTime)
    password = db.Column(db.String(1000))
    position = db.Column(db.String(1000))
    institute = db.Column(db.String(1000))
    interests = db.Column(db.String(10000))
    CV_path = db.Column(db.String(1000))
    profile_picture_path = db.Column(db.String(1000))
    github_account = db.Column(db.String(1000))
    linkedin_account = db.Column(db.String(1000))
    jc_count = db.Column(db.Integer)
    query_count = db.Column(db.Integer)
    last_seen = db.Column(db.DateTime)
    confirmed = db.Column(db.SmallInteger) # use this instead of db.Boolean... otherwise there is an error in db.migrade

    followed = db.relationship('User', 
                           secondary=followers, 
                           primaryjoin=(followers.c.follower_id == id), 
                           secondaryjoin=(followers.c.followed_id == id), 
                           backref=db.backref('followers', lazy='dynamic'), 
                           lazy='dynamic')
    user_queries = db.relationship('Queries', backref='user')
    reading_list = db.relationship('Papers', 
                               secondary="join(Papers, ReadingList,     Papers.arxiv_id == ReadingList.arxiv_id)",
                               primaryjoin="and_(User.id ==     ReadingList.user_id)")
    group_leader = db.relationship('Groups', backref='user')
    vote_list = db.relationship('Papers', 
                            secondary="join(Papers, VoteList, Papers.arxiv_id == VoteList.arxiv_id)",
                            primaryjoin="and_(User.id == VoteList.user_id)")
    group_memberships = db.relationship('Groups',
                                    secondary="join(Members, Groups, Members.group_id == Groups.id)",
                                    primaryjoin="and_(User.id == Members.user_id)") 

我尝试删除的是

>>> groups = models.Groups.query.all()
>>> groups
[<Groups 1>, <Groups 2>]
>>> db.session.delete(groups[1])
>>> db.session.commit()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 150, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 790, in commit
    self.transaction.commit()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 392, in commit
    self._prepare_impl()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 372, in _prepare_impl
    self.session.flush()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2004, in flush
    self._flush(objects)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2122, in _flush
    transaction.rollback(_capture_exception=True)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2086, in _flush
    flush_context.execute()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 373, in execute
    rec.execute(self)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 485, in execute
    self.dependency_processor.process_deletes(uow, states)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/dependency.py", line 1023, in process_deletes
    secondary_update, secondary_delete)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/dependency.py", line 1098, in _run_crud
    statement = self.secondary.delete(sql.and_(*[
AttributeError: 'Join' object has no attribute 'delete'

有什么想法吗? 卡尔

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    通过阅读错误代码,SQL-Alchemy 似乎也在尝试删除 Group 引用的其他表中的行。但是,因为引用似乎返回了一个没有删除功能的连接,因为连接中的行不是表中的行,而是不同表的行的组合,所以会引发错误。

    我无法找到您的错误的解决方案,因为我无法复制它,因为我不知道关系中使用的其他表的模型。如果您添加PapersVoteListMembersUser 的模型,我将更有机会找到解决方案。

    附带说明: 你到底想达成什么样的关系?像这样的连接是相当先进的,并且大多数时候有一种更简单的方法来实现所需的结果。在Group.members的情况下,最好有一个从MemberUser和从MemberGroup的外键关系,后者带有一个反向引用(docsapi )?然后,您可以使用类似的代码来获取所有成员:

    # somegroup = Group()
    users = [member.user for member in somegroup.member]
    

    编辑: 从您的模型来看,您似乎想要Groups.members 的多对多关系 (tutorial)。

    【讨论】:

    • 嗨,马丁,感谢您的回答。我在上面的原始问题中添加了其他表格。我刚开始使用 sql-alchemy,我确信我的设置可以改进。现在,我可以使用 groups.members 获取组的所有成员。我认为那很好,这就是我选择这个设置的原因。你的方法有什么优势?
    • 嗨马丁,你是说我的关系有问题吗?你能多说一下我在哪个方面做错了吗?我查看了多对多关系的教程,但我不明白如何让 group.members 工作,因为这些组仅通过成员连接到 User 表......所以我必须使用一些 join don'我?
    猜你喜欢
    • 2015-10-24
    • 2011-03-20
    • 2020-10-29
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多