3

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 型がないため、使用していません。

4

0 に答える 0