首页 > 解决方案 > 通过 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'

标签: enterprise-architect

解决方案


所以我弄清楚这里出了什么问题。

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)

肯定有更强大的方法来做到这一点,要么将所有标签转换为小写/大写,要么搜索entityidEntityID ,而不是像我在root[0][0][0]中那样在root中索引它[0].标签。但这目前可行,将来我可能会写出更好的版本。


推荐阅读