Linux で Sqlalchemy と Pyodbc を使用して Python からアクセスしようとしている SQL Server 2005 データベースがあります。もともと私は Windows でスクリプトを書き、問題なく動作しましたが、それを Centos 6.4 64 ビット サーバーに転送すると、問題が発生しました。クエリを実行すると、次のエラー メッセージが表示されます。
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'TBL_WF_DESTINATION.DESTINATION_ID'"
Sqlalchemy 宣言構文を使用すると、クエリは次のようになります。
destinations = session.query(Destination).all()
はDestination
、既存のテーブルにマップされたクラスです。
前のクエリは成功します。
models = session.query(Model).all()
どういうわけか、Pyodbc には 30 文字を超える識別子の問題があるようです - TBL_WF_DESTINATION.DESTINATION_ID は 33 文字の長さですが、TBL_WF_MODEL.MODEL_ID は 21 です。広範なグーグル検索中に、30 文字の識別子制限への参照に出くわしました - ただし、 MSSQL のコンテキストで言及されたことはなく、すべての投稿は数年前のものです。これが私のコード定義の一部です:
engine = create_engine('mssql+pyodbc://name:password@dsn')
最大ラベル長 = 30 を指定すると、実際には問題が修正されますが、回避策と考えています。
engine = create_engine('mssql+pyodbc://name:password@dsn', label_length=30)
30 を超えるとコードが壊れます。
ここに /etc/freetds.conf があります
[mssql_server]
host = some_ip_addr
port = 1433
tds version = 7.2
/etc/odbcinst.ini
[mssql]
Description = FreeTDS for MSSQL
Driver = /usr/lib64/libtdsodbc.so
Setup = /usr/lib64/libtdsS.so
TDS Version = 7.2
FileUsage = 1
~/.odbc.ini
[dsn]
Driver=mssql
Description=some description
Server=some_ip_addr
Database=db_name
Port=1433
Python 2.7.5、SQLAlchemy 0.8.2、pyodbc 3.0.7、freetds 0.91、unixODBC 2.2.14。
私の質問は本当に-30文字を超える識別子を使用できないというのは、何が間違っているのですか? 私にはかなり人為的な制限のように思えます。それを機能させるより良い方法はありますか?
PS pymssql バックエンドで同じコードを実行できますが、ネイティブの Decimal 型がないため、使用していません。