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)是列类型。
我的两个问题:
FWIW,使用raw_connection()代替connect().
遇到了类似的三个问题(不回答这个特定问题)。我需要使用connect()+execute()方法。
如果没有,是否可以获得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)
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |