私は sqlite のマニフェスト タイピング / タイプ アフィニティのアイデアが好きです。
http://www.sqlite.org/datatype3.html
基本的に、列のアフィニティを「数値」に設定すると、整数型または浮動小数点型をダックしてそれらを格納しますが、必要に応じて文字列を格納することもできます。これは、列に格納したいデータが事前にわからない場合に、列に最適な「デフォルト」タイプのようです。
だから私は行きます:
metadata = MetaData()
new_table = Table(table_name, metadata )
for col_name in column_headings:
new_table.append_column(Column(col_name,
sqlite.NUMERIC, #this should duck-type numbers but can handle strings as well
primary_key=col_name in primary_key_columns))
new_table.create(self.engine, checkfirst=False)
しかし、テーブルに「abc」などの文字列値を保存しようとすると、sqlalchemy が失敗します。
File "[...]\sqlalchemy\processors.py", line 79, in to_float
return float(value)
ValueError: invalid literal for float(): abc
ブー、ヒス。それで、sqliteに型付けをさせるようにsqlalchemyを納得させる方法はありますか? おそらく、sqlachemy.dialects.sqlite の代わりに sqlalchemy.types の型を使用できますか?
[編集:] ボーナス ポイント: イントロスペクション/リフレクションを介してテーブルにアクセスできる必要があります。したがって、これを meta.reflect() で機能させる何らかの方法は素晴らしいでしょう! ;-)