SQLAlchemyは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
>>>
ベンダー固有のタイプの使用方法については、こちらをご覧ください: http ://docs.sqlalchemy.org/en/latest/core/type_basics.html#vendor-specific-types
価値のあることとして、完全にブランドに中立なデータベースレイヤーを開発しようとすることは困難であり、努力する価値があることはめったにありません。私は数年前にZendFramework1.0に取り組み、そのフレームワークでサポートされているすべてのSQLデータベース用の汎用単体テストスイートを作成しようとしました。すべてのデータ型がANSI/ISO SQL標準をサポートしていると主張しているにもかかわらず、SQLのすべての実装で同じ方法でサポートされているデータ型はほとんどないことがわかりました。
最終的には、データレイヤー用に独自のクラス階層を開発し、データベース固有のアダプターごとにコードを少し異なる方法で実装する必要があります。
更新:ニュースは私たちが思っているよりも良いと思います。このテストを試しました:
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)
次に、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
したがって、SQLAlchemyの一般的なString
をマップします データ型を多かれ少なかれ適切なMySQLデータ型に変換します。
予想よりも大きなデータ型を使用していたことは、私にとって驚くことではありません。 MEDIUMTEXT
バイトで16MBをサポート 、文字ではありません 。私のデフォルトの文字セットはマルチバイトのutfmb4であるため、MEDIUMTEXT
の最大長 実際には2^24文字よりはるかに少ないです。そのため、LONGTEXT
にアップグレードする必要がありました 。もちろん、2^32文字はLONGTEXT
に収まりません どちらかですが、SQLAlchemyはとにかく列を作成するつもりであると想定しているようです。
完全に実装中立のコードを実行するのはまだ難しいと思います。たとえば、ストレージエンジンのテーブルオプションなどのMySQL機能や、一般的な同等の機能がない特定のデータ型(ENUM
など)を使用する場合はどうでしょうか。 )?