python-在SQLAlchemy中左外部联接的右侧删除NULL
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-在SQLAlchemy中左外部联接的右侧删除NULL,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1881字,纯文字阅读大概需要3分钟。
内容图文
![python-在SQLAlchemy中左外部联接的右侧删除NULL](/upload/InfoBanner/zyjiaocheng/885/311e28ada38f48d6948dbd6cc1ddb7ff.jpg)
我有一个Track表和Artist表. Artist表具有一个ID,Track表具有一个外键artist_id.我要删除所有没有关联曲目的艺术家.
在SQL中:
delete from artists
where id in (select artists.id
from artists left outer join tracks
on tracks.artist_id = artists.id
where tracks.id is null);
完美地运作.但是,当我尝试在SQLAlchemy中复制此代码时:
artists = session.query(Artist.id).outerjoin((Track, Artist.id == Track.artist_id)).filter(Track.id == None)
print('deleting %d unused artists' % artists.count())
session.query(Artist).filter(Artist.id.in_(artists.all())).delete()
print()可以正常工作(并显示正确的行数),但删除操作会出现错误:
...
sqlalchemy.orm.evaluator.UnevaluatableError: Cannot evaluate clauselist with operator <function comma_op at 0x2d3e0d8>
During handling of the above exception, another exception occurred:
...
"Could not evaluate current criteria in Python. "
sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.
那么如何在SQLAlchemy中做到这一点?我不介意方法是否有所不同,只要我可以删除不属于曲目的所有艺术家即可.
PS我也尝试了artist.delete()(在选择Artist实例时,而不是上面的id),这也给出了一个错误-在这种情况下,外部联接“丢失”并且SQL不一致.
更新资料
如果这对任何人都有用,那么如果您的模型中有一个backref(如下所示,艺术家),则比外部联接要简单得多:
session.query(Artist).filter(Artist.tracks == None).delete(synchronize_session=False)
解决方法:
唯一的例外是告诉您如何解决此问题,您需要将syncnize_session指定为“ fetch”或False之一. Sqlalchemy试图通过将删除直接应用于python对象来更新附加到会话的对象的状态以反映数据库中的更改,从而避免做一些额外的工作.
不幸的是,它无法对此查询执行此操作,因此您需要告诉它“获取”活动的Artist,以查看他们是否被删除,或者忽略它们,并使会话保持无效状态.
您还会因in_(query.all())生产而陷入困境;因为sqlalchemy不知道如何绑定元组的列表,所以对原始查询的恢复也不完美.只需in_(query)就足够了.
内容总结
以上是互联网集市为您收集整理的python-在SQLAlchemy中左外部联接的右侧删除NULL全部内容,希望文章能够帮你解决python-在SQLAlchemy中左外部联接的右侧删除NULL所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。