python - 如何在 SqlServer 中以编程方式生成表的 DDL?
问题描述
我正在尝试使用 Python 在 SQL Server 中生成表的 DDL。我试图运行语句:show create table schema.table
这不起作用。所以我在网上寻求一些帮助,发现我们可以运行 proc: sp_help
as exec sp_help schema.tablename
。我尝试生成 DDL 的原因之一是获取 DDL 并在我的目标数据库中创建它们(它在雪花中,我也在编写代码来创建表)从表中获取 PRIMARY 和 UNIQUE KEYS并在我的代码中使用它们(一些要求)。
当我如下运行 show create table 时,出现如下语法错误:
import pyodbc
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
"Server=servername;"
"Database=dbname;"
"uid=user;pwd=pwd")
cursor = cnxn.cursor()
cursor.execute('show create table dbname.tablename')
错误:
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'tablename'. (102) (SQLExecDirectW)")
所以我在 Sql Server 管理工作室中运行 sp_help 如下:
exec sp_help 'dbo.tablename';
结果:
在图像中,proc: sp_help 返回大量数据,列名出现在结果的第二个表中,键约束出现在结果的最后一个表中。
所有这些结果都可以在 Sql Server Studio 中找到。所以我在python中运行proc如下:
>>> import pymssql
>>> conn = pymssql.connect(host='Server\\Server',user='user', password='pwd',database='dbname')
>>> cur = conn.cursor()
>>> cursor.execute("exec sp_help 'dbo.tablename'")
但是,如果我从光标迭代结果如下:
>>> for r in cursor:
... print(r)
...
我只看到结果中的第一个表:
('tablename', 'dbo', 'user table', datetime.datetime(2020, 8, 27, 9, 51, 11, 213000))
此结果是上图中结果的第一个表。
该循环不打印图像中显示的其他详细信息,我不明白如何正确实现循环以打印/访问上图中显示的其他数据。无论如何我可以从 Python 中的 SQL Server 获取 DDL 吗?任何帮助表示赞赏。
解决方案
事实上,SQL Sever 中的一个过程可以返回多个数据集。你必须检查:
- 您的语言在执行过程时管理多个数据集的能力(某些语言无法做到!)
- 对多个数据集进行循环
推荐阅读
- angular - 如何在 Angular 5 中更改 ng-template 变量
- python - Django:固定装置对象不可检索
- javascript - 创建具有扩展行的基本表
- python - 将级别附加到 pandas MultiIndex
- java - 是否可以在创建对象后使其不可变
- javascript - react-bootstrap中的多行ButtonGroup
- javascript - React-slick carousel - 自动播放在子组件中不起作用,同时使用父组件的道具触发它
- angular - 无法以角度形式显示 formcontrol 对象
- c# - 修改后无法更新 ModelState
- c - 将前导零添加到 C 中的字符串值