sql >> Databáze >  >> RDS >> Mysql

Jaký typ sloupce používá SQLAlchemy pro text na MySQL?

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 )?



  1. Jaký je nejelegantnější způsob, jak uložit časové razítko s nanosec v postgresql?

  2. MySQL obsahuje nula řádků při použití COUNT s GROUP BY

  3. Postgresql DROP TABLE nefunguje

  4. Umožněte hibernaci zpětně uvozovat všechny názvy tabulek / sloupců