SQLAlchemy在MySQL上用于"Text"的列类型是什么?

aug*_*ray 9 python mysql postgresql sqlalchemy

我的整个用例是试图确定我是否可以编写一些数据库不可知(至少支持Postgres和MySQL)存储一些大数据作为原始文本(认为~500MB作为粗略的理论上限).基于这个关于MySQL字符串/文本类型的答案,看起来只有LONGTEXT列类型才能满足我的要求.我正在使用SQLAlchemy,它声称它的Text列类型是可变长度字符串,但它通常也映射到数据库的CLOB或TEXT类型.MySQL没有CLOB类型(虽然它有一个BLOB),它的TEXT类型不足以满足我的需求.

那么,SQLAlchemy在MySQL上用于"Text"的列类型是什么?

Bil*_*win 10

看起来像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
>>> 
Run Code Online (Sandbox Code Playgroud)

请在此处查看如何使用特定于供应商的类型:http: //docs.sqlalchemy.org/en/latest/core/type_basics.html#vendor-specific-types

对于它的价值,尝试开发一个完全品牌中立的数据库层很困难,而且很少值得努力.几年前我在Zend Framework 1.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)
Run Code Online (Sandbox Code Playgroud)

然后我检查了它在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
Run Code Online (Sandbox Code Playgroud)

因此,它确实将SQLAlchemy的通用String数据类型映射到一个或多或少适当的MySQL数据类型.

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

我仍然认为很难完全实现中立的代码.例如,如果要使用某些MySQL功能(如存储引擎的表选项)或没有通用等效项的特定数据类型(例如ENUM),该怎么办?


tan*_*ndy 9

在SQLAlchemy 1.2.7中,Text数据类型映射到MySQL类型"text"或"longtext",具体取决于您输入的长度.

body_html = Column(Text())
body_plain = Column(Text(4294000000))
Run Code Online (Sandbox Code Playgroud)

在MySQL中创建以下内容:

| Field           | Type         | 
+-----------------+--------------+
| body_html       | text         |
| body_plain      | longtext     |
Run Code Online (Sandbox Code Playgroud)