繁体   English   中英

SQLAlchemy 删除多对多行

[英]SQLAlchemy delete many to many row

我使用带有 sqlalchemy(新的)和 python 的 postgresql 数据库。我有两个表在多对多表上有关系......

我想删除机器人和钱包/鲸鱼之间的关系。 如果可能的话,如果关系表中没有其他机器人,那么鲸鱼也是如此。

这里的模型:

WhaleBot = Table('whale_bot', Base.metadata,
    Column('id', Integer, primary_key=True, nullable=False),
    Column('whale_id', Integer, ForeignKey('whales.id'), nullable=False),
    Column('bot_id', Integer, ForeignKey('bots.id'), nullable=False),
    Column('created_at', DateTime(timezone=True), server_default=func.now(), nullable=False),
    Column('updated_at', DateTime(timezone=True), default=func.now(), onupdate=func.now(), nullable=False),
    UniqueConstraint('whale_id', 'bot_id', name='uix_1')

class Whale(Base):
    __tablename__ = 'whales'

    id = Column(Integer, primary_key=True, nullable=False)
    wallet = Column(String, unique=True, nullable=False)
    is_contract = Column(Boolean, nullable=False)
    created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
    updated_at = Column(DateTime(timezone=True), default=func.now(), onupdate=func.now(), nullable=False)

    bots = relationship('Bot', secondary=WhaleBot, cascade="all, delete", backref='Whale')

class Bot(Base):
    __tablename__ = 'bots'

    id = Column(Integer, primary_key=True, nullable=False)
    name = Column(String, nullable=False)
    created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
    updated_at = Column(DateTime(timezone=True), default=func.now(), onupdate=func.now(), nullable=False)

    whales = relationship('Whale', secondary=WhaleBot, cascade="all, delete", backref='Bot')
)


这是我到目前为止尝试的代码:

def delete_wallet(self, wallet, botId):
        try:
            walletId = self.dbEngine.session.query(Whale.id).filter(Whale.wallet == wallet).scalar()
            toDelete =self.dbEngine.session.query(WhaleBot).filter(WhaleBot.c.bot_id == botId).filter(WhaleBot.c.whale_id == walletId).first()
            print(toDelete.id)
            #WhaleBot.query().filter(id == toDelete.id).delete()
            #self.dbEngine.session.query(WhaleBot).query.filter(id == toDelete.id).delete()
            #self.dbEngine.session.query(WhaleBot).filter_by(id == toDelete.id).delete()
            # toDelete = self.dbEngine.session.query(Whale).filter(Whale.wallet == wallet).scalar()
            #self.dbEngine.session.delete(WhaleBot).filter(WhaleBot.c.id == toDelete)
            obj = self.dbEngine.WhaleBot.filter_by(id == toDelete.id).one()
            #obj = User.query.filter_by(id=123).one()
            self.dbEngine.session.delete(obj)

            self.dbEngine.session.commit()
            return True, "Deleted"
        except Exception as e:
            exc_type, exc_obj, exc_tb = sys.exc_info()
            fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
            with open("errorlog.txt",'a') as f:
                f.write("delete error: "+dt.now().strftime('%Y-%m-%d %H:%M:%S')+" "+str(e)+ "\n"+
                str(fname)+" Line: "+str(exc_tb.tb_lineno)+ "\n")
            return False, "Something wrong"


我让评论进来,所以你可以看到我尝试了很多......

这里有一些案例,它出现了错误......也许你可以告诉我我错在哪里,以便我了解 sqlalchemy - 但也只是一个解决方案会很好:) 案例 1

walletId = self.dbEngine.session.query(Whale.id).filter(Whale.wallet == wallet).scalar()
toDelete =self.dbEngine.session.query(WhaleBot).filter(WhaleBot.c.bot_id == botId).filter(WhaleBot.c.whale_id == walletId).first()
obj = self.dbEngine.WhaleBot.filter_by(id == toDelete.id).one()
self.dbEngine.session.delete(obj)
            

错误案例 1:

'DBEngine' object has no attribute 'WhaleBot'

案例2(在互联网上找到):

walletId = self.dbEngine.session.query(Whale.id).filter(Whale.wallet == wallet).scalar()
toDelete =self.dbEngine.session.query(WhaleBot).filter(WhaleBot.c.bot_id ==botId).filter(WhaleBot.c.whale_id == walletId).first()
self.dbEngine.session.query(WhaleBot).query.filter(id == toDelete.id).delete()

错误案例 2:

'Query' object has no attribute 'query'

案例3:

walletId = self.dbEngine.session.query(Whale.id).filter(Whale.wallet == wallet).scalar()
toDelete =self.dbEngine.session.query(WhaleBot).filter(WhaleBot.c.bot_id ==botId).filter(WhaleBot.c.whale_id == walletId).first()
self.dbEngine.session.query(WhaleBot).filter_by(WhaleBot.c.id == toDelete.id).delete()

错误案例 3:

'NoneType' object has no attribute 'class_'

重点就像我说我是 SQLalchemy 的新手,不知道在哪里搜索(我的代码/declerations 或我调用函数的方式......)

是的,我尝试了许多其他方法......但是是的,例外情况足够多 xD

您可以像这样删除关系:

whale = session.query(Whale).filter(Whale.wallet == wallet).one()
bot = session.query(Bot).get(botId)
whale.bots.remove(bot)
session.commit()

或者反过来:

whale = session.query(Whale).filter(Whale.wallet == wallet).one()
bot = session.query(Bot).get(botId)
whale.bots.remove(bot)
session.commit()

此处查看有关删除多对多关系的文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM