首页 > 解决方案 > SQLAlchemy 从查询结果中访问列类型

问题描述

我正在使用 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

这导致:

(('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))

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

前两项(名称和类型代码)是必需的,其他五项是可选的,如果无法提供有意义的值,则设置为无。

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

我的两个问题:

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

FWIW,使用raw_connection()而不是connect().

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

标签: pythonsql-serversqlalchemypymssql

解决方案


如果不是,是否可以获取 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) ; 

在您的示例中:

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

为了:

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)     |
+-----------------+----------+------------------+

db<>小提琴演示


推荐阅读