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),该怎么办?
在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)
| 归档时间: |
|
| 查看次数: |
12663 次 |
| 最近记录: |