是否存在与Python的集合类型相当的MySQL?

时间:2014-02-12 14:43:59

标签: python mysql set

标题说明了一切:我正在寻找一种在MySQL数据库中保留Python [冻结]集的标准方法。

注意:SET MySql数据类型不是等价的;它更像是来自受限制列表对象的多项选择。

注意(2):我可以发明一些特别的东西;假设我的set是不包含逗号的字符串,我可以将它记录为以逗号分隔的有序字符串列表。我正在寻找更通用,更标准的东西。

注意(3):我看过MySQL参考网页。我在那里找不到它。我仍在问,因为我对数据库不太熟悉,我认为有可能存在标准方法。

2 个答案:

答案 0 :(得分:1)

这很简单:“我正在寻找一种在MySQL数据库中保留Python [冻结]集的标准方法。”

这不是:“* SQL相当于Python的集合类型?”

集合类型不仅包含值 - 它允许使用它们进行集合操作 - 最接近的方法是ENUM类型 - https://dev.mysql.com/doc/refman/5.0/en/enum.html - 但你必须为你想要的每一组创建一个枚举。

但是,如果您想要保留冻结集的值以便稍后从Python检索它,您可以使用Pickle轻松地将其序列化,并将其作为BLOB存储在SQL数据库中:

import pickle

...
data = pickle.dumps(my_frozen_set)
cursor.execute(""" INSERT INTO mytable VALUES (%s,)""", (data,))

答案 1 :(得分:1)

在SQL中实现set的正确方法是使用两个额外的表:

CREATE TABLE set (
    id int unsigned PRIMARY KEY AUTO_INCREMENT
);

CREATE TABLE set_member (
    set_id int unsigned NOT NULL,
    FOREIGN KEY (set_id) REFERENCES set(id),
    member <whatever_type_your_set_is_of> NOT NULL,
    UNIQUE (set_id, member)
);

(如果您只想在一个表中存储集合,并且该表具有唯一的ID,您可能能够避开set表,并且您将只在表中存储每个记录一个集合)

由于您很可能没有寻找合适的SQL方法(这在行为上很好,如果你永远不会在任何数据库内执行任何操作除了存储和检索之外,您可能会将您的集合非规范化存储在表格的单个字段中,而不是遵循建议的做法;在这种情况下,没有可以表示Python集的本机MySQL数据类型,您需要在varchartext列中序列化您的集合。完全取决于您选择适合您需求的序列化格式。