【问题标题】:python pyodbc SQL Server Native Client 11.0 cannot return geometry columnpython pyodbc SQL Server Native Client 11.0 无法返回几何列
【发布时间】:2019-02-25 19:21:39
【问题描述】:

我使用 python 2.7 安装了 SQL Server Native Client 11.0 和 pyodbc。我能够在 python 中正确设置连接

import pyodbc
conn = pyodbc.connect('DRIVER={SQL Server Native Client 11.0};SERVER=b;DATABASE=b;UID=b;PWD=b')
cur=conn.cursor()
query=cur.execute('''select top 1 * from table''')
for x in query.fetchall():
    print x

Traceback (most recent call last):
  File "<module1>", line 8, in <module>
ProgrammingError: ('ODBC SQL type -151 is not yet supported.  column-index=40  type=-151', 'HY106')

如果我这样做,我会得到同样的错误

for x in query:
   print x

如何返回查询?

如果我只是打印查询,我会得到pyodbc.Cursor object at 0x02B74AD8

可能是它无法读取的列类型,此表中有一个点几何。

更新

问题在于点几何。当我取出几何图形时,我可以返回光标包含的内容。但是,当几何列在那里时,它总是会出现此错误。我假设 pyodbc 不支持几何对象...作为一种解决方法,我可以转换为 WKT

【问题讨论】:

标签: python sql-server pyodbc


【解决方案1】:

基于 GitHub 问题here,以下output converter function 似乎可以解决问题:

def unpack_geometry(raw_bytes):
    # adapted from SSCLRT information at
    #   https://docs.microsoft.com/en-us/openspecs/sql_server_protocols/ms-ssclrt/dc988cb6-4812-4ec6-91cd-cce329f6ecda
    tup = struct.unpack('<i2b3d', raw_bytes)
    # tup contains: (unknown, Version, Serialization_Properties, X, Y, SRID)
    return tup[3], tup[4], tup[5]

# ...

cnxn.add_output_converter(-151, unpack_geometry)
crsr.execute("SELECT CAST('POINT(-79.528874 43.648533 12345)' AS geometry)")
print(crsr.fetchval())  # (-79.528874, 43.648533, 12345.0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多