我的总体用例试图确定我是否能够为一些大数据编写一个与数据库无关的存储(至少支持Postgres和MySQL)作为原始文本(将500 My看作一个粗略的理论上限)。
基于关于this answer字符串/文本类型的MySQL,看起来只有LONGTEXT列类型才能满足我的要求。我使用的是SQLAlchemy,它声称它的Text列类型是用于可变长度字符串的,但是它通常映射到数据库的CLOB或TEXT类型。MySQL没有CLOB类型(虽然它有BLOB),而且它的TEXT类型不足以满足我的需要。
那么,SQLAlchemy对Text在MySQL上使用什么列类型呢?
发布于 2017-12-05 01:46:19
看起来SQLAlchemy支持LONGTEXT:
$ 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标准。
最终,您必须为数据层开发自己的类层次结构,并为每个特定于数据库的适配器实现稍微不同的代码。
更新:我认为这个消息比我们想象的要好。我试过这个测试:
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数据库中创建了什么:
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),该怎么办?
发布于 2018-04-25 22:28:17
在SQLAlchemy 1.2.7中,文本数据类型根据输入的长度映射到MySQL类型TEXT或LONGTEXT。
body_html = Column(Text())
body_plain = Column(Text(4294000000))在MySQL中创建以下内容:
| Field | Type |
+-----------------+--------------+
| body_html | text |
| body_plain | longtext |https://stackoverflow.com/questions/47644739
复制相似问题