是否有非Sqlalchemy方式来处理Python中的多对多关系?

时间:2014-01-09 07:28:49

标签: python sqlite database-design sqlalchemy many-to-many

我在网上搜索了很长一段时间来处理python sqlite3中多对多关系的方法,但似乎所有这些都导致了Sqlalchemy。我并不反对使用sqlalchemy(虽然我发现它不时有点过分,并且在很多情况下确实会引入一些不必要的逻辑),我想知道是否有一个提供基本CRUD的“黄金类/功能”直接界面而不打扰Sqlalchemy?任何参考(在线或纸质)将受到高度赞赏。

2 个答案:

答案 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

这三个表代表两个模型(usercategory)和一个多对多关系(category_permission

你必须手动查询它们并且还要手动维护存储的关系。基于您正在使用的SQL引擎,您应该考虑使用

  • 所有两个列上的表category_permission中的唯一索引
  • 在删除内容时保留关键字以保持关系。

然后您可以选择这种方式:

-- 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的支持并不常见(我的两分钱: - ))。