Vypadá to, že SQLAlchemy podporuje 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
>>>
Podívejte se, jak používat typy specifické pro dodavatele:http ://docs.sqlalchemy.org/en/latest/core/type_basics.html#vendor-specific-types
Za to, co stojí za to, pokusit se vyvinout zcela značkově neutrální databázovou vrstvu je obtížné a zřídka stojí za námahu. Před několika lety jsem pracoval na Zend Frameworku 1.0 a pokusil jsem se vytvořit generickou sadu pro testování jednotek pro všechny databáze SQL podporované tímto rámcem. Zjistil jsem, že jen velmi málo datových typů je podporováno stejným způsobem ve všech implementacích SQL, přestože všechny tvrdí, že podporují standard ANSI/ISO SQL.
Nakonec musíte vyvinout vlastní hierarchii tříd pro vaši datovou vrstvu a implementovat kód mírně odlišně pro každý adaptér specifický pro databázi.
Aktualizace:Myslím, že zprávy jsou lepší, než si myslíme. Zkoušel jsem tento test:
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)
Pak jsem zkontroloval, co to nakonec vytvořilo v databázi 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
Mapuje tedy obecný String
SQLAlchemy datový typ na víceméně vhodný datový typ MySQL.
Nepřekvapuje mě, že používal větší datové typy, než bychom čekali. MEDIUMTEXT
podporuje 16 MB v bajtech , nikoli znaky . Protože moje výchozí znaková sada je vícebajtový utfmb4, maximální délka MEDIUMTEXT
je ve skutečnosti mnohem méně než 2^24 znaků. Muselo to tedy upgradovat na LONGTEXT
. 2^32 znaků se samozřejmě nevejde do LONGTEXT
buď, ale zdá se, že SQLAlchemy předpokládá, že přesto chcete vytvořit sloupec.
Stále si myslím, že je těžké vytvořit zcela implementačně neutrální kód. Co když například chcete použít některé funkce MySQL, jako jsou možnosti tabulky pro modul úložiště, nebo konkrétní datové typy bez generického ekvivalentu (například ENUM
)?