Mysql
 sql >> Database >  >> RDS >> Mysql

Quale tipo di colonna utilizza SQLAlchemy per Text on MySQL?

Sembra che SQLAlchemy supporti 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
>>> 

Scopri come utilizzare i tipi specifici del fornitore qui:http ://docs.sqlalchemy.org/en/latest/core/type_basics.html#tipi-specifici del fornitore

Per quel che vale, provare a sviluppare un livello di database totalmente indipendente dal marchio è difficile e raramente ne vale la pena. Ho lavorato su Zend Framework 1.0 alcuni anni fa e ho provato a creare una suite di unit test generica per tutti i database SQL supportati da quel framework. Ho scoperto che pochissimi tipi di dati sono supportati allo stesso modo in tutte le implementazioni di SQL, nonostante tutti affermino di supportare lo standard ANSI/ISO SQL.

In definitiva, devi sviluppare la tua gerarchia di classi per il tuo livello dati e implementare il codice in modo leggermente diverso per ogni adattatore specifico del database.

Aggiornamento:penso che la notizia sia migliore di quanto pensiamo. Ho provato questo 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)

Quindi ho controllato per vedere cosa ha finito per creare nel database 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

Quindi mappa la generica String di SQLAlchemy tipo di dati a un tipo di dati MySQL più o meno appropriato.

Non sorprende che abbia utilizzato tipi di dati più grandi di quanto potremmo aspettarci. Il MEDIUMTEXT supporta 16 MB in byte , non in caratteri . Poiché il mio set di caratteri predefinito è il multibyte utfmb4, la lunghezza massima di MEDIUMTEXT è in realtà molto meno di 2^24 caratteri. Quindi ha dovuto aggiornarlo a LONGTEXT . Ovviamente, 2^32 caratteri non rientrano in LONGTEXT neanche, ma sembra che SQLAlchemy presuppone che tu intenda creare comunque una colonna.

Penso ancora che sia difficile fare un codice totalmente indipendente dall'implementazione. Ad esempio, cosa succede se si desidera utilizzare alcune funzionalità di MySQL come le opzioni della tabella per il motore di archiviazione o tipi di dati specifici senza equivalenti generici (ad esempio, ENUM )?