Có vẻ như SQLAlchemy hỗ trợ 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
>>>
Xem cách sử dụng các loại dành riêng cho nhà cung cấp tại đây: http ://docs.sqlalchemy.org/en/latest/core/type_basics.html#vendor-specific-types
Đối với những gì nó đáng giá, cố gắng phát triển một lớp cơ sở dữ liệu hoàn toàn trung lập với thương hiệu là rất khó và hiếm khi xứng đáng với nỗ lực. Tôi đã làm việc trên Zend Framework 1.0 vài năm trước và tôi đã cố gắng tạo một bộ thử nghiệm đơn vị chung cho tất cả các cơ sở dữ liệu SQL được hỗ trợ bởi khung đó. Tôi nhận thấy rằng rất ít kiểu dữ liệu được hỗ trợ theo cùng một cách trên tất cả các triển khai SQL, mặc dù tất cả chúng đều tuyên bố hỗ trợ tiêu chuẩn ANSI / ISO SQL.
Cuối cùng, bạn phải phát triển hệ thống phân cấp lớp của riêng mình cho lớp dữ liệu của bạn và triển khai mã hơi khác nhau cho từng bộ điều hợp dành riêng cho cơ sở dữ liệu.
Cập nhật:Tôi nghĩ tin tức tốt hơn chúng ta nghĩ. Tôi đã thử kiểm tra này:
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)
Sau đó, tôi kiểm tra xem nó đã tạo ra những gì cuối cùng trong cơ sở dữ liệu 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
Vì vậy, nó ánh xạ String
chung của SQLAlchemy kiểu dữ liệu sang kiểu dữ liệu MySQL thích hợp hơn hoặc ít hơn.
Tôi không ngạc nhiên khi nó sử dụng các kiểu dữ liệu lớn hơn chúng ta có thể mong đợi. MEDIUMTEXT
hỗ trợ 16MB tính bằng byte , không có trong ký tự . Vì bộ ký tự mặc định của tôi là utfmb4 nhiều byte, độ dài tối đa của MEDIUMTEXT
thực sự ít hơn 2 ^ 24 ký tự. Vì vậy, nó đã phải nâng cấp nó lên LONGTEXT
. Tất nhiên, 2 ^ 32 ký tự sẽ không vừa với LONGTEXT
nhưng có vẻ như SQLAlchemy cho rằng bạn vẫn muốn tạo một cột.
Tôi vẫn nghĩ rằng thật khó để thực hiện mã trung lập hoàn toàn. Ví dụ:điều gì sẽ xảy ra nếu bạn muốn sử dụng một số tính năng của MySQL như tùy chọn bảng cho công cụ lưu trữ hoặc các kiểu dữ liệu cụ thể không có tính năng tương đương chung (ví dụ:ENUM
)?