【问题标题】:Is there a Non-Sqlalchemy way to deal with many-to-many relationships in Python?是否有一种非 Sqlalchemy 方法来处理 Python 中的多对多关系?
【发布时间】:2014-01-27 15:24:17
【问题描述】:

我在网上搜索了很长时间,寻找一种在python sqlite3中处理多对多关系的方法,但似乎都导致了Sqlalchemy。我根本不反对使用 sqlalchemy(尽管我不时觉得它有点矫枉过正,而且在很多情况下它确实引入了一些不必要的逻辑),我想知道是否有一个提供基本 CRUD 的“黄金类/函数”直接接口而不打扰Sqlalchemy?任何参考资料(在线或纸质)都将受到高度赞赏。

【问题讨论】:

  • 问题不在于是否可以在 python 中处理多对多,而是在 SQL 中。 Sqlalchemy 只是一个建立在 SQL 语言和 sqlite API(等等)之上的库。多对多关系是使用junction table 实现的。或者您的意思是您正在寻找一种比 Sqlalchemy 更轻量且支持多对多的 Object-Relational Mapper?
  • 正是西里扬!这正是我正在寻找的,重量更轻的 ORM!我喜欢这个充满真正天才的论坛。你们可以如此优雅地表达一个技术问题!
  • 哦,顺便说一句,请不要推荐jango,在我看来,这并不比sqlalchemy轻多少。:)
  • 我认为你会发现很难找到比 SQLAlchemy 更轻,但同时提供比 SQLAlchemy 更多功能的东西。无论如何,这个问题基本上是要求对工具进行推荐,这特别是 StackOverflow 无法回答的问题类型之一。

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


【解决方案1】:

如果您想解决基本 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(它总是会引导您找到某个框架)。多对多关系是关系数据库中的常见问题。

【讨论】:

  • 嗨 Petr,感谢您的回答,但我实际上正在寻找一种规范的方法来构建提供非常轻量级的对象关系映射器的父类,并且它应该接收任意 **kw参数和决定智能地操纵表上的底层多对多 CRUD 操作。我很惊讶我将不得不求助于 Mysql 示例。为什么sqlite上没有这样的例子,用Python编程比较常见?
  • 或许你可以用dataset做这个父类来处理SQL(dataset.readthedocs.org/en/latest
【解决方案2】:

如果您正在查看除 SqlAlchemy 之外的其他 ORM,您可以比较此处介绍的 ORM:What are some good Python ORM solutions?

我亲自尝试过Storm,它几乎透明地支持多对多,但您必须编写 SQL 来创建表 (IIRC)。

我也试过秋天,它已经死了,但有一个叉子存在:AutORM。它非常轻量级,但不支持多对多。您可能可以通过显式声明您的联结表来解决这个问题,并且它针对的是 sqlite(请参阅 peewee)。

我测试了 dejavu (dejavu) 和 peewee,它们也没有透明的多对多,但解释了 how to do it in its docs(您可以将其应用于 AutoORM)。

对于我自己的情况,我最终使用了 SqlAlchemy,因为 ORM 所需的机器是如此之大,以至于我更愿意以价格获得更多功能,而当时 Python 3 支持并不常见(我的两分钱:- ) )。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2021-09-24
    • 2013-11-05
    • 2020-03-02
    • 2019-12-06
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多