SQLAlchemy 从查询结果中访问列类型

Sum*_*edh 7 python sql-server sqlalchemy pymssql

我正在使用 SQLAlchemy(带有pymssql驱动程序)连接到 SQL Server 数据库。

import sqlalchemy

conn_string = f'mssql+pymssql://{uid}:{pwd}@{instance}/?database={db};charset=utf8'
sql = 'SELECT * FROM FAKETABLE;'

engine = sqlalchemy.create_engine(conn_string)
connection = engine.connect()
result = connection.execute(sql)
result.cursor.description
Run Code Online (Sandbox Code Playgroud)

这导致:

(('col_1', 1, None, None, None, None, None),
 ('col_2', 1, None, None, None, None, None),
 ('col_3', 4, None, None, None, None, None),
 ('col_4', 3, None, None, None, None, None),
 ('col_5', 3, None, None, None, None, None))
Run Code Online (Sandbox Code Playgroud)

根据PEP 249(光标的.description属性):

前两项(name 和 type_code)是强制性的,其他五项是可选的,如果不能提供有意义的值,则设置为 None。

我假设整数(1, 1, 4, 3, 3)是列类型。

我的两个问题:

  1. 如何将这些整数映射到数据类型(如 char、integer 等)?
  2. 这些是 SQL 数据类型吗?如果不是,是否可以获取 SQL 数据类型?

FWIW,使用raw_connection()代替connect().

遇到了类似的三个问题(不回答这个特定问题)。我需要使用connect()+execute()方法。

Luk*_*zda 3

如果没有,是否可以获得SQL数据类型?

SQL Server 函数sys.dm_exec_describe_first_result_set可用于直接获取所提供查询的 SQL 列的数据类型:

SELECT column_ordinal, name, system_type_name, *
FROM sys.dm_exec_describe_first_result_set('here goes query', NULL, 0) ; 
Run Code Online (Sandbox Code Playgroud)

在你的例子中:

sql = """SELECT column_ordinal, name, system_type_name 
    FROM sys.dm_exec_describe_first_result_set('SELECT * FROM FAKETABLE', NULL, 0) ;"""
Run Code Online (Sandbox Code Playgroud)

为了:

CREATE TABLE FAKETABLE(id INT, d DATE, country NVARCHAR(10));

SELECT column_ordinal, name, system_type_name 
FROM sys.dm_exec_describe_first_result_set('SELECT * FROM FAKETABLE', NULL, 0) ;

+-----------------+----------+------------------+
| column_ordinal  |  name    | system_type_name |
+-----------------+----------+------------------+
|              1  | id       | int              |
|              2  | d        | date             |
|              3  | country  | nvarchar(10)     |
+-----------------+----------+------------------+
Run Code Online (Sandbox Code Playgroud)

db<>小提琴演示