mysql - 如何确定存储可变字符串的字段的长度?
Posted
技术标签:
【中文标题】mysql - 如何确定存储可变字符串的字段的长度?【英文标题】:mysql - How to determine the length of a field which stores a mutable string? 【发布时间】:2016-09-10 14:48:15 【问题描述】:我正在开发一个 ios 应用程序,我使用 Flask(一个 Python 框架)来构建我的后端。
我将数据存储在mysql
数据库中。
现在我需要在一个属性中存储一堆 ID。
首先,我将存储 ID 的数组转换为 JSON
格式对象。
然后我遇到了一个问题。 如何存储这个对象?
由于对象的长度可能相当大(我无法确定我存储了多少个 ID),并且 SQLAlchemy
在创建表时要求属性具有精确的长度,那么如何确定属性的长度呢?
【问题讨论】:
我不知道 SQLAlchemy,但您几乎可以肯定希望将此字段声明为 TEXT 类型,它不需要最大长度。 【参考方案1】:如果您使用 MySQL 5.7 或更新版本
你应该看看新的JSON type。
您可以通过 sqlalchemy 的type.JSON 使用此 MySQL 功能。这将大大简化列数据管理。
data_table = Table('data_table', metadata,
Column('id', Integer, primary_key=True),
Column('loosely_related_ids', JSON)
)
with engine.connect() as conn:
conn.execute(
data_table.insert(),
loosely_related_ids = [1, 54, 56, 99, 104]
)
稍后访问loosely_related_ids 字段将返回一个您可以正常访问的python 数组。
如果您使用的是旧版本的 MySQL
您应该使用 TEXT 字段或类似类型的包装器。
SQLAlchemy 提供了PickleType field,它在 BLOB 字段之上实现,将为您处理数组的酸洗和解酸。请记住,酸洗 python 对象和在解释器之间共享它们的所有警告在这里仍然适用。
【讨论】:
感谢您的回答。我实际上使用 MySQL 5.6,但我会更新它并试一试。 :) 但我认为创建另一个表并将每个 ID 保存为单个记录可能是更好的选择! :)(如果有兴趣,请查看@KIDJourney 的回答) 我假设您实际上需要在一列上存储一个值列表。如果没有额外要求,您绝对应该使用 _R_DBMS 的关系功能,并查看 sqlalchemy 基本关系模式docs.sqlalchemy.org/en/latest/orm/…【参考方案2】:我不知道你遇到的情况,但是不建议将多条记录存储在一个列中,在ID owner
和ID
之间建立关系图更规范。
例如,您可以创建一个名为“IDs”的新表,其架构如下:
id int auto increment ,
idbla varchar(<Your ID Length>)
owner int not null
当您尝试获取某个用户x
的所有idbla
时,您可以使用
SELECT * idbla from IDs where owner = x
另一种选择:
您可以使用nosql
(非关系数据库)来存储您的数据,它类似于文档,非常适合您的情况。
【讨论】:
由于我在数据库管理方面的经验不是很丰富,所以我只是简单地考虑将所有 ID 保存在一列中,因为我担心如果我这样做会花费很多时间来搜索每条记录正如你在第一选择中所说。但后来我发现这不是真的。所以第一选择对我来说似乎是一个很好的解决方案。谢谢!以上是关于mysql - 如何确定存储可变字符串的字段的长度?的主要内容,如果未能解决你的问题,请参考以下文章