Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Welchen Spaltentyp verwendet SQLAlchemy für Text in MySQL?

Sieht so aus, als ob SQLAlchemy LONGTEXT unterstützt:

$ 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
>>> 

Sehen Sie hier, wie Sie herstellerspezifische Typen verwenden:http ://docs.sqlalchemy.org/en/latest/core/type_basics.html#vendor-specific-types

Für das, was es wert ist, ist der Versuch, eine völlig markenneutrale Datenbankschicht zu entwickeln, schwierig und selten die Mühe wert. Ich habe vor einigen Jahren am Zend Framework 1.0 gearbeitet und versucht, eine generische Unit-Testing-Suite für alle SQL-Datenbanken zu erstellen, die von diesem Framework unterstützt werden. Ich habe festgestellt, dass nur sehr wenige Datentypen in allen SQL-Implementierungen auf die gleiche Weise unterstützt werden, obwohl sie alle behaupten, den ANSI/ISO-SQL-Standard zu unterstützen.

Letztendlich müssen Sie Ihre eigene Klassenhierarchie für Ihre Datenschicht entwickeln und den Code für jeden datenbankspezifischen Adapter etwas anders implementieren.

Update:Ich denke, die Nachrichten sind besser als wir denken. Ich habe diesen Test ausprobiert:

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)

Dann habe ich überprüft, was es letztendlich in der MySQL-Datenbank erstellt hat:

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

Es bildet also den generischen String von SQLAlchemy ab Datentyp in einen mehr oder weniger geeigneten MySQL-Datentyp.

Es überrascht mich nicht, dass größere Datentypen verwendet wurden, als wir vielleicht erwarten würden. Der MEDIUMTEXT unterstützt 16 MB in Bytes , nicht in Zeichen . Da mein Standardzeichensatz das Multibyte utfmb4 ist, ist die maximale Länge von MEDIUMTEXT ist eigentlich viel weniger als 2^24 Zeichen. Also musste es auf LONGTEXT aktualisiert werden . Natürlich passen 2^32 Zeichen nicht in LONGTEXT auch nicht, aber anscheinend geht SQLAlchemy davon aus, dass Sie trotzdem eine Spalte erstellen wollen.

Ich denke immer noch, dass es schwierig ist, vollständig implementierungsneutralen Code zu schreiben. Was ist beispielsweise, wenn Sie einige MySQL-Funktionen wie Tabellenoptionen für die Speicher-Engine oder bestimmte Datentypen ohne generische Entsprechung verwenden möchten (z. B. ENUM )?