Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Jenis kolom apa yang digunakan SQLAlchemy untuk Teks di MySQL?

Sepertinya SQLAlchemy mendukung 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
>>> 

Lihat cara menggunakan jenis khusus vendor di sini:http ://docs.sqlalchemy.org/en/latest/core/type_basics.html#vendor-specific-types

Untuk apa nilainya, mencoba mengembangkan lapisan basis data yang benar-benar netral merek itu sulit, dan jarang sepadan dengan usaha. Saya bekerja di Zend Framework 1.0 beberapa tahun yang lalu, dan saya mencoba membuat suite pengujian unit generik untuk semua database SQL yang didukung oleh framework itu. Saya menemukan bahwa sangat sedikit tipe data yang didukung dengan cara yang sama di semua implementasi SQL, meskipun semuanya mengklaim mendukung standar ANSI/ISO SQL.

Pada akhirnya, Anda harus mengembangkan hierarki kelas Anda sendiri untuk lapisan data Anda, dan menerapkan kode yang sedikit berbeda untuk setiap adaptor khusus basis data.

Pembaruan:Saya pikir beritanya lebih baik dari yang kami kira. Saya mencoba tes ini:

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)

Kemudian saya memeriksa untuk melihat apa yang akhirnya dibuat di 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

Jadi itu memetakan String generik SQLAlchemy tipe data ke tipe data MySQL yang kurang lebih sesuai.

Tidak mengherankan bagi saya bahwa itu menggunakan tipe data yang lebih besar dari yang kita harapkan. MEDIUMTEXT mendukung 16MB dalam byte , bukan dalam karakter . Karena set karakter default saya adalah utfmb4 multi-byte, panjang maksimal MEDIUMTEXT sebenarnya jauh lebih sedikit dari 2^24 karakter. Jadi harus diupgrade ke LONGTEXT . Tentu saja, 2^32 karakter tidak akan muat di LONGTEXT juga, tetapi tampaknya SQLAlchemy menganggap Anda bermaksud membuat kolom.

Saya masih berpikir bahwa sulit untuk melakukan kode implementasi-netral sepenuhnya. Misalnya, bagaimana jika Anda ingin menggunakan beberapa fitur MySQL seperti opsi tabel untuk mesin penyimpanan, atau tipe data tertentu tanpa padanan umum (misalnya, ENUM )?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT INTO dan kesalahan variabel yang tidak dideklarasikan

  2. Akses Ditolak untuk MYSQL ERROR 1045

  3. Solusi untuk pernyataan dinamis dalam prosedur tersimpan yang dipanggil dari pemicu

  4. Re-Slaving Server Master MySQL yang Rusak dalam Pengaturan Replikasi Semisinkron

  5. Menemukan id berikutnya yang tersedia di MySQL