我有一个 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 类型,因此我没有使用它。