怎样用python+sqlalchemy获得mssql视图对应物理表关系(二)

话不多说

目标:为了实现低代码数据视图对接,有必要得到视图所对应物理表及字段名称,字段类型等

1)约束:视图中用到的物理表不能起别名,所以修改上一篇中存储过程建立语句

USE [agui_conn]
GO
/****** Object:  StoredProcedure [dbo].[sp_GetOrdersByTimestamp]    Script Date: 09/29/2024 14:40:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_GetOrdersByTimestamp]@Timestamp NVARCHAR(100),@Condition NVARCHAR(100) -- 假设这是一个额外的条件,如订单状态
AS
BEGINIF OBJECT_ID('dbo.vw_OrdersByTimestamp', 'V') IS NOT NULLBEGINEXEC sp_executesql N'DROP VIEW dbo.vw_OrdersByTimestamp';END-- 创建一个视图来显示所需的订单信息DECLARE @sql NVARCHAR(MAX);SET @sql = N'CREATE VIEW dbo.vw_OrdersByTimestamp ASSELECT Users.Username as 用户名, Orders.OrderTime as 订单时间,Orders.Amount as 订单金额,'''+ @Timestamp + ''' AS 查询时间FROM OrdersINNER JOIN Users ON Orders.UserId = Users.UserIdWHERE (Orders.Status = ''' + @Condition+ ''')'; -- 假设订单表中有一个Status字段o.OrderTime >= ''' + CONVERT(NVARCHAR, @Timestamp, 120) + ''' ANDEXEC sp_executesql @sql;END

2)在 SQL Server 中,用存储过程创建的视图没有出现在 sys.views 中,尝试查询 sys.objects 来获取所有对象的列表:

SELECT OBJECT_SCHEMA_NAME(object_id) AS SchemaName,OBJECT_NAME(object_id) AS ViewName
FROM sys.objects
WHERE OBJECTPROPERTY(object_id, 'IsView') = 1;

3)通过sys.objects获得指定视图的描述

SchemaName='dbo'ViewName='vw_OrdersByTimestamp'create_view_query = text(f"""SELECT OBJECT_DEFINITION(OBJECT_ID('{SchemaName}.{ViewName}')) as ViewDefinitionFROM sys.objectsWHERE OBJECTPROPERTY(object_id, 'IsView') = 1AND OBJECT_NAME(object_id) = '{ViewName}'AND OBJECT_SCHEMA_NAME(object_id) = '{SchemaName}'""")result = conn.execute(create_view_query)create_view_result = result.fetchone()view_creation_sql=create_view_result['ViewDefinition']print(view_creation_sql)

结果如图:

4)用正则表达式匹配视图字段名和对应的物理表名及字段名

# 正则表达式匹配视图字段名和对应的物理表名及字段名column_pattern = re.compile(r"(\w+\.\w+) as (\w+)", re.IGNORECASE)# 提取字段映射columns_mapping = column_pattern.findall(view_creation_sql)# 常量值匹配constant_pattern = re.compile(r"'([^']*)' AS (\w+)", re.IGNORECASE)constants_mapping = constant_pattern.findall(view_creation_sql)field_dict = {}for column, alias in columns_mapping:field_dict[f'{alias}'] = columnfor constant, alias in constants_mapping:field_dict[f'{alias}'] = None# 反射视图的列信息table = Table(view_name, metadata, autoload=True, autoload_with=engine)for column in table.columns:v_field = f"{column.name}"tb_field = field_dict[v_field]print(f"视图字段名: {column.name}, 对应表字段: {tb_field}, 数据类型: {column.type}")

最终实现结果

到此,祝大家节日快乐!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云服务升级的兼容性测试

云服务升级后,用户使用的前端版本和升级服务可能存在兼容问题,需要进行兼容性验证。 最复杂的兼容性测试,是对所有支持版本都进行完整回归验证,但这种方式耗时耗力,对大多数公司来说,均不太可行。 从风险…

04 面部表情识别:Pytorch实现表情识别-表情数据集训练代码

总目录:人脸检测与表情分类 https://blog.csdn.net/whiffeyf/category_12793480.html 目录 0 相关资料1 面部表情识数据集2 模型下载3 训练 0 相关资料 面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码):https://blog.csdn.n…

vscode配置Eslint后保存出现大量波浪线

解决问题:配置代码格式化 快捷键打开设置:ctrlshiftP 输入: format code 选择:

UE5 项目缓存文件删除、版本控制说明(工程目录结构)

文章目录 前言一、项目文件示例二、缓存文件删除、版本控制说明前言 我们在拷贝项目或者使用 Git 进行版本控制,如果不对文件选择性的控制,大量缓存文件会导致传输速度变慢;或者我们的项目报错了,想要删除缓存文件又不知如何下手,哪些是可删除的,哪些又是不可删除的,本…

SLA(立体光固化成型技术)

01 SLA 3D打印技术简介 SLA工艺简介 SLA是"Stereo lithography Appearance"的缩写,即立体光固化成型法。用特定波长与强度的激光聚焦到光固化材料表面,使之由点到线,由线到面顺序凝固,完成一个层面的绘图作业&#x…

OpenCV图像文件读写(4)解码图像数据函数imdecode()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从内存缓冲区读取图像。 imdecode 函数从指定的内存缓冲区读取图像。如果缓冲区太短或包含无效数据,函数将返回一个空矩阵 (Mat::dat…

儿童乐园软件下载安装 佳易王游乐场会员扣次管理系统操作教程

一、前言 儿童乐园软件下载安装 佳易王游乐场会员扣次管理系统操作教程 软件为绿色免安装版,已经内置数据库,不需再安装数据库文件,软件解压即可。 二、软件程序教程 1、软件可同时管理多个项目,项目设置方法如图,点…

一般的网页结构是什么样的?

网页源码结构概述 一个典型的网页源码结构通常包含以下几个主要部分&#xff1a; ‌DOCTYPE 声明‌ 位于HTML文档的最前面&#xff0c;用于告诉浏览器文档使用哪个HTML版本进行解析。例如&#xff1a;<!DOCTYPE html>。 ‌html 元素‌ 这是整个HTML文档的根元素&#xf…

mariadb无法存储中文

如果 MariaDB 无法存储中文&#xff0c;可能有以下几个原因及解决方法&#xff1a; 一、字符集设置问题 1.检查数据库字符集&#xff1a; 使用以下 SQL 语句查看当前数据库的字符集设置&#xff1a; SHOW VARIABLES LIKE character_set_database;SHOW VARIABLES LIKE collat…

基于微信小程序爱心领养小程序设计与实现(源码+参考文档+定制开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

grafana频繁DataSourceError问题

背景 随着 Grafana 数据量的不断增加&#xff0c;逐渐暴露出以下问题&#xff1a; Grafana 页面加载缓慢&#xff1b;Grafana 告警频繁出现 DatasourceError 错误。 对于第一个问题&#xff0c;大家可以参考这篇文章&#xff1a;Grafana 加载缓慢的解决方案。 不过&#xf…

828华为云征文|华为云Flexus X实例Windows Server 2019安装护卫神防火墙——为企业运维安全发挥重要作用!!!

前言 公司最近需要选购一台华为云Windows服务器部署产品应用&#xff0c;但是考虑到Windows的安全性至关重要。护卫神防火墙无疑是守护Windows系统安全的得力助手。 华为云以其强大的性能和稳定的服务&#xff0c;为众多企业和开发者提供了可靠的云端基础设施。在网络环境日益复…

【Python报错已解决】 TypeError: ‘ellipsis‘ object is not subscriptable

引言&#xff1a; 在Python开发过程中&#xff0c;遇到报错是家常便饭。而每一种报错都像是一个谜题&#xff0c;等待着开发者去解开。今天我们就来探讨一个特定的Python报错&#xff1a;TypeError: ‘ellipsis‘ object is not subscriptable。这个报错可能会让很多开发者感到…

【高效办公】商汤办公小浣熊微信小程序:随时随地搞定数据分析

在这个数据驱动的时代&#xff0c;无论是职场新人还是经验丰富的专业人士&#xff0c;都需要处理大量的数据和报表。为了提高工作效率&#xff0c;各种智能化工具层出不穷。今天要向大家推荐一款由商汤科技研发的高效数据分析工具——“办公小浣熊”&#xff01; 一、办公小浣…

vue2.0如何获取地址栏地址

在Vue 2.0中&#xff0c;你可以使用this.$route对象来获取当前的路由信息&#xff0c;包括地址栏地址。你需要确保你的项目中已经安装并配置了vue-router。 以下是一个简单的例子&#xff0c;展示如何在Vue组件中获取并打印当前的地址栏地址&#xff1a; <template><…

C++与Live555实现RTSP服务器

一、引言&#xff08;Introduction&#xff09; 1.1 RTSP服务器的重要性&#xff08;Importance of RTSP Server&#xff09; RTSP&#xff08;Real Time Streaming Protocol&#xff0c;实时流传输协议&#xff09;服务器在现代网络传输中扮演着至关重要的角色。RTSP服务器主…

【实战篇】怎么最快地复制一张表?

背景 怎么在两张表中拷贝数据&#xff1f;如果可以控制对源表的扫描行数和加锁范围很小的话&#xff0c;我们简单地使用 insert … select 语句即可实现。 当然&#xff0c;为了避免对源表加读锁&#xff0c;更稳妥的方案是先将数据写到外部文本文件&#xff0c;然后再写回目…

【chrome 插件】初窥

目录结构 -----manifest.json #配置文件 |----content.js #对应操纵浏览器页面 |----background.js #一直运行在后台&#xff0c;负责持久化数据, 负责与服务器交互数据 |----popup.js #自动配置到 popup.html, 有权限操纵 popup.html |----popup.html #插件页面其中 popup.j…

unity 介绍Visual Scripting Scene Variables

Visual Scripting中的场景变量是指在Unity中使用可视化脚本时&#xff0c;能够在不同场景间传递和存储数据的变量。这些变量可以用来跟踪游戏状态、玩家信息或其他动态数据&#xff0c;允许开发者在不编写代码的情况下创建复杂的游戏逻辑。 场景变量的优势包括&#xff1a; 1…

JavaScript 中的 === 运算符

是JavaScript中的严格相等运算符。它用于比较两个值是否完全相等,不仅比较值,还比较类型。这与 (相等运算符)不同,后者在比较之前会进行类型转换。 示例 1. 比较相同类型的值 console.log(5 5); // true console.log(hello hello); // true console.log(true true); …