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

Hvilken kolonnetype bruger SQLAlchemy til tekst på MySQL?

Det ser ud til, at SQLAlchemy understøtter 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
>>> 

Se, hvordan du bruger leverandørspecifikke typer her:http ://docs.sqlalchemy.org/en/latest/core/type_basics.html#vendor-specific-types

For hvad det er værd, er det svært at forsøge at udvikle et helt mærkeneutralt databaselag og sjældent besværet værd. Jeg arbejdede på Zend Framework 1.0 for nogle år siden, og jeg forsøgte at skabe en generisk enhedstestpakke for alle de SQL-databaser, der understøttes af den ramme. Jeg fandt ud af, at meget få datatyper understøttes på samme måde på tværs af alle implementeringer af SQL, på trods af at de alle hævder at understøtte ANSI/ISO SQL-standarden.

I sidste ende skal du udvikle dit eget klassehierarki for dit datalag og implementere koden lidt forskelligt for hver databasespecifik adapter.

Opdatering:Jeg synes, nyhederne er bedre, end vi tror. Jeg prøvede denne 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)

Så tjekkede jeg for at se, hvad det endte med at skabe i MySQL-databasen:

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

Så det kortlægger SQLAlchemys generiske String datatype til en mere eller mindre passende MySQL-datatype.

Det er ikke overraskende for mig, at den brugte større datatyper, end vi kunne forvente. MEDIUMTEXT understøtter 16 MB i bytes , ikke i tegn . Fordi mit standardtegnsæt er multi-byte utfmb4, er den maksimale længde på MEDIUMTEXT er faktisk meget færre end 2^24 tegn. Så den var nødt til at opgradere den til LONGTEXT . Selvfølgelig passer 2^32 tegn ikke i LONGTEXT enten, men det ser ud til, at SQLAlchemy antager, at du alligevel mener at oprette en kolonne.

Jeg synes stadig, at det er svært at lave en fuldstændig implementeringsneutral kode. For eksempel, hvad hvis du vil bruge nogle MySQL-funktioner som tabelindstillinger for lagermotoren eller specifikke datatyper uden generisk ækvivalent (f.eks. ENUM )?



  1. Sammenlign strenge, der ignorerer accenter i SQL (ORACLE)

  2. Indsættelse af flere værdier i en MySQL på én gang

  3. Datoforskel i MySQL for at beregne alder

  4. mysql en-til-mange-forespørgsel med negation og/eller flere kriterier