sql >> Databasteknik >  >> RDS >> Mysql

Vilken kolumntyp använder SQLAlchemy för text på MySQL?

Det verkar som att SQLAlchemy stöder 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 hur du använder leverantörsspecifika typer här:http ://docs.sqlalchemy.org/en/latest/core/type_basics.html#vendor-specific-types

För vad det är värt är det svårt att försöka utveckla ett helt varumärkesneutralt databaslager och sällan värt ansträngningen. Jag arbetade på Zend Framework 1.0 för några år sedan, och jag försökte skapa en generisk enhetstestsvit för alla SQL-databaser som stöds av det ramverket. Jag upptäckte att väldigt få datatyper stöds på samma sätt i alla implementeringar av SQL, trots att de alla hävdar att de stöder ANSI/ISO SQL-standarden.

I slutändan måste du utveckla din egen klasshierarki för ditt datalager och implementera koden lite annorlunda för varje databasspecifik adapter.

Uppdatering:Jag tycker att nyheterna är bättre än vi tror. Jag provade det här testet:

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)

Sedan kollade jag för att se vad det slutade skapa 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 mappar SQLAlchemys generiska String datatyp till en mer eller mindre lämplig MySQL-datatyp.

Det är inte förvånande för mig att den använde större datatyper än vi kan förvänta oss. MEDIUMTEXT stöder 16 MB i byte , inte i tecken . Eftersom min standardteckenuppsättning är multi-byte utfmb4, maxlängden på MEDIUMTEXT är faktiskt mycket färre än 2^24 tecken. Så den var tvungen att uppgradera den till LONGTEXT . Naturligtvis får 2^32 tecken inte plats i LONGTEXT antingen, men det verkar som att SQLAlchemy antar att du menar att skapa en kolumn ändå.

Jag tror fortfarande att det är svårt att göra helt implementeringsneutral kod. Till exempel, vad händer om du vill använda vissa MySQL-funktioner som tabellalternativ för lagringsmotorn eller specifika datatyper utan generisk motsvarighet (till exempel ENUM )?



  1. Konfigurera en lyssnare i Oracle Database (12c, 18c och 19c utgåvor)

  2. OracleException (0x80004005) vid anslutning till Oracle Database

  3. Hur lagrar man europeisk valuta i MySQL?

  4. Oracle-parametrar med IN-sats?