これは私にとって長年の問題でした。変更できない独自のデータベースがあり、テーブルの多くには、たとえば decimal(12, 4) として定義されたフィールドがあります。
このようなpyodbc/freeTDSを使用して、ubuntu 12.04でそのようなテーブルからデータを取得しようとすると...
import pyodbc
connection_string = 'DRIVER={FreeTDS};DSN=<myDSN>;UID=<my_user>;PWD=<my_password>;'
conn = pyodbc.connect(connection_string)
cur = conn.cursor()
cur.execute('SELECT myfield FROM mytable')
for row in cur.fetchall():
print row[0]
...本当に役に立たないメッセージが表示されます。
Traceback (most recent call last): File
"/path/to/testing_pyodbc.py", line 6, in <module>
for row in cur.fetchall(): pyodbc.Error: ('HY000', 'The driver did not supply an error!')
結果をフロートにキャストすると、クエリは問題なく実行されます。
import pyodbc
connection_string = 'DRIVER={FreeTDS};DSN=<myDSN>;UID=<my_user>;PWD=<my_password>;'
conn = pyodbc.connect(connection_string)
cur = conn.cursor()
cur.execute('SELECT CAST(myfield AS FLOAT) FROM mytable')
for row in cur.fetchall():
print row[0]
私の最初の質問は、テーブル構造を変更せずにこの問題を解決できるかということです。データベースは私のものではないため、変更するアクセス権がありません。
SQLAlachemy を使用して、データベースからこのデータを取得したいと思います。このようにWindowsでとても楽しくやっています。
class MyTable(Base):
__tablename__ = u'table'
...
myfield = Column(DECIMAL(12, 4), nullable=True)
another_field = Column(DECIMAL(12, 4), nullable=True)
...
私の 2 番目の質問 (最初の質問が解決できない場合) は、sqlAlchemy クラスを定義して、内部でデータをフロートに自動的にキャストし、クラスを使用するコードがそれについて心配する必要がないようにすることはできますか?
ubuntu 12.04 を実行しているため、インストールされている freetds のバージョンは 0.91 です。
$ dpkg -s freetds-common
Package: freetds-common
Status: install ok installed
Multi-Arch: foreign
Priority: optional
Section: libs
Installed-Size: 91
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: all
Source: freetds
Version: 0.91-1
Replaces: libct3, libct4 (<< 0.82-1)
Description: configuration files for FreeTDS SQL client libraries
FreeTDS is an implementation of the Tabular DataStream protocol, used for
connecting to MS SQL and Sybase servers over TCP/IP.
.
This package manages the configuration files that are common to all of
the TDS client library implementations (CT-Lib, DB-Lib, and ODBC),
stored in /etc/freetds/.
Original-Maintainer: Steve Langasek <vorlon@debian.org>
Homepage: http://www.freetds.org/
しかし、tsql に尋ねると、v0.64 と表示されます。
$ tsql -C
Compile-time settings (established with the "configure" script):
Version: freetds v0.64
MS db-lib source compatibility: no
Sybase binary compatibility: unknown
Thread safety: yes
iconv library: yes
TDS version: 5.0
iODBC: no
unixodbc: yes
また、コマンド ラインで tsql または isql を使用すると、CAST() 操作なしで喜んでデータを提供してくれます。