3

我有一个 SQL Server 2005 数据库,我试图在 Linux 上使用 Sqlalchemy 和 Pyodbc 从 Python 访问它。最初我在 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