首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy对MySQL上的“文本”使用什么列类型?

SQLAlchemy对MySQL上的“文本”使用什么列类型?
EN

Stack Overflow用户
提问于 2017-12-05 01:38:56
回答 2查看 47.3K关注 0票数 22

我的总体用例试图确定我是否能够为一些大数据编写一个与数据库无关的存储(至少支持Postgres和MySQL)作为原始文本(将500 My看作一个粗略的理论上限)。

基于关于this answer字符串/文本类型的MySQL,看起来只有LONGTEXT列类型才能满足我的要求。我使用的是SQLAlchemy,它声称它的Text列类型是用于可变长度字符串的,但是它通常映射到数据库的CLOBTEXT类型。MySQL没有CLOB类型(虽然它有BLOB),而且它的TEXT类型不足以满足我的需要。

那么,SQLAlchemy对Text在MySQL上使用什么列类型呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-05 01:46:19

看起来SQLAlchemy支持LONGTEXT:

代码语言:javascript
复制
$ python
Python 2.7.13 (default, Sep 29 2017, 15:31:18) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from sqlalchemy.dialects.mysql import LONGTEXT
>>> 

请参见如何在此处使用特定于供应商的类型:basics.html#vendor-specific-types

就其价值而言,尝试开发一个完全与品牌无关的数据库层是很困难的,而且很少值得付出努力。几年前,我开发了ZendFramework1.0,并尝试为该框架支持的所有SQL数据库创建一个通用单元测试套件。我发现,在所有SQL实现中,很少有数据类型以相同的方式得到支持,尽管它们都声称支持ANSI/ISO SQL标准。

最终,您必须为数据层开发自己的类层次结构,并为每个特定于数据库的适配器实现稍微不同的代码。

更新:我认为这个消息比我们想象的要好。我试过这个测试:

代码语言:javascript
复制
t2 = Table('t2', metadata,
      Column('id', Integer, primary_key=True),
      Column('t1', String(64000)),
      Column('t2', String(16000000)),
      Column('t3', String(4294000000)),
      Column('t4', Text)
     )

metadata.create_all(engine)

然后,我检查了它最终在MySQL数据库中创建了什么:

代码语言:javascript
复制
mysql> show create table t2;

CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `t1` mediumtext,
  `t2` longtext,
  `t3` longtext,
  `t4` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

因此,它确实将SQLAlchemy的泛型String数据类型映射为或多或少合适的MySQL数据类型。

它使用的数据类型比我们预期的要大,这一点对我来说并不奇怪。MEDIUMTEXT支持16 in的字节,而不是字符。因为我的默认字符集是多字节utfmb4,所以MEDIUMTEXT的最大长度实际上远远小于2^24个字符。因此,它必须升级到LONGTEXT。当然,2^32个字符也不适合在LONGTEXT中使用,但SQLAlchemy似乎假设您无论如何都要创建一个列。

我仍然认为很难完全实现中立的代码。例如,如果您想使用一些MySQL特性,比如存储引擎的表选项,或者没有泛型等效的特定数据类型(例如,ENUM),该怎么办?

票数 27
EN

Stack Overflow用户

发布于 2018-04-25 22:28:17

在SQLAlchemy 1.2.7中,文本数据类型根据输入的长度映射到MySQL类型TEXTLONGTEXT

代码语言:javascript
复制
body_html = Column(Text())
body_plain = Column(Text(4294000000))

在MySQL中创建以下内容:

代码语言:javascript
复制
| Field           | Type         | 
+-----------------+--------------+
| body_html       | text         |
| body_plain      | longtext     |
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47644739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档