[英]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.