enterprise-architect - 通过 Python 的 SQL 查询适用于本地模型,但不适用于数据库
问题描述
我正在编写一个名为get_all_locks()的 Python 函数来获取某个用户锁定的所有元素。我正在使用win32com.client.Dispatch("EA.App").Repository与 EA 通信。该函数在本地 EA 模型 (.eapx) 上调用时运行良好,但在数据库上使用时不返回任何结果。Microsoft OLE DB Provider for ODBC Drivers用作数据库接口。我需要在查询语法中修改什么以使其也可以与数据库一起使用吗?
这是功能:
def get_all_locks(self, domain, user_login):
locked_elems = set()
query = ("select * from t_secuser u where u.UserLogin = '{0}\\{1}'"
.format(domain, user_login))
result = self.rep.SQLQuery(query)
root = ET.fromstring(result)
if not list(root):
print("User not found!")
return locked_elems
query = ("select s.EntityID from t_seclocks s inner join t_secuser u "
"on s.userID = u.userID where u.UserLogin = '{0}\\{1}'"
.format(domain, user_login))
result = self.rep.SQLQuery(query)
root = ET.fromstring(result)
for entity in root.iter('EntityID'):
locked_elems.add(entity.text)
return locked_elems
在 EA 查询界面中使用以下 SQL 查询可以很好地与本地 eapx 和远程数据库一起使用:
select s.EntityID from t_seclocks s inner join t_secuser u
on s.userID = u.userID where u.UserLogin = 'domain\username'
解决方案
所以我弄清楚这里出了什么问题。
SQLQuery 在本地 (.eapx) 模型上返回的 XML 具有 ElementGUID 的标记EntityID,而 SQLQuery 在数据库上返回的 XML 具有标记entityid。问题是root.iter('Xyz')区分大小写,这就是为什么在数据库返回的 XML 中搜索EntityID时没有得到任何结果的原因。
就我而言,我确切地知道我的 XML 的结构将是什么,所以我修改了我的代码,首先查看 ElementGUID 的标签是什么,然后使用root.iter()搜索它。
result = self.rep.SQLQuery(query)
root = ET.fromstring(result)
guid_tag = root[0][0][0][0].tag
for entity in root.iter(guid_tag):
locked_elems.add(entity.text)
肯定有更强大的方法来做到这一点,要么将所有标签转换为小写/大写,要么搜索entityid或EntityID ,而不是像我在root[0][0][0]中那样在root中索引它[0].标签。但这目前可行,将来我可能会写出更好的版本。
推荐阅读
- react-native - React Native Metro Bundler 问题与无效的左侧 AssingmentExpression
- java - 如何在 Spring UriComponentsBuilder 中编码逗号?
- python-2.7 - 如何使用 Cloud Composer/Apache Airflow 运行带有设置文件的 Dataflow 管道?
- c - 该程序显示没有错误,但它没有编译。你能帮我做我需要做的吗
- php - zend framework 3 - 如何禁用整个控制器的布局
- webpack - Storybook 无法从 create-react-app 中找到 .ttf、.otf、.png、.svg、.jpg 模块
- typescript - 填充值后,角度材质图标不可见
- c# - 我无法为 CodeDom 编译的应用程序创建标签
- c# - 在启动中启用 CORS 失败并出现预检错误
- angular - 读取路由参数?