我在网上搜索了很长一段时间来处理python sqlite3中多对多关系的方法,但似乎所有这些都导致了Sqlalchemy。我并不反对使用sqlalchemy(虽然我发现它不时有点过分,并且在很多情况下确实会引入一些不必要的逻辑),我想知道是否有一个提供基本CRUD的“黄金类/功能”直接界面而不打扰Sqlalchemy?任何参考(在线或纸质)将受到高度赞赏。
答案 0 :(得分:2)
如果你想解决基本SQL中的多对多关系,你可以使用第三个表来手动处理这些关系。
CREATE TABLE users {
int user_id,
varchar user_name
};
CREATE TABLE categories {
int category_id,
varchar category_name
};
CREATE TABLE category_permission {
int user_id,
int category_id
}; -- for storing relations
这三个表代表两个模型(user
,category
)和一个多对多关系(category_permission
)
你必须手动查询它们并且还要手动维护存储的关系。基于您正在使用的SQL引擎,您应该考虑使用
然后您可以选择这种方式:
-- to list all users and their category count
SELECT U.user_name, count(CP.category_id) as 'permitted'
FROM users U
LEFT JOIN category_permission PM
ON PM.user_id = U.user_id
ORDER BY permitted DESC;
-- to list all categories for __desired_user__
SELECT C.* FROM categories C
JOIN category_permission CM
ON CM.category_id = C.category_id
WHERE CM.user_id = __desired_user_id__;
进一步参考搜索SQL解决方案而不是Python(这将始终引导您到某个框架)。多对多关系是关系数据库中的常见问题。
答案 1 :(得分:1)
如果您正在查看除SqlAlchemy之外的其他ORM,您可以比较此处显示的ORM:What are some good Python ORM solutions?
我个人尝试Storm几乎透明地支持多对多,但你必须编写SQL来创建表(IIRC)。
我也尝试过已经死亡的秋天,但叉子存在:AutORM。它非常轻巧,但不支持多对多。您可以通过明确声明联结表来解决这个问题,并将其定位到sqlite(请参阅peewee)。
我测试了dejavu(死)和peewee,它也没有透明的多对多,但解释how to do it in its docs(你可以将它应用于AutORM)。
对于我自己的情况,我最后使用了SqlAlchemy,因为ORM所需的机器无论如何都很大,以至于我更喜欢以更高的价格获得更多的功能,那时Python 3的支持并不常见(我的两分钱: - ))。