【发布时间】:2020-04-07 19:32:24
【问题描述】:
我有 3 个表中的数据。对于 tblDataDef 中的每个条目,我都有几个标签(如主题标签或类别)。这些标签存储在 tblDataTags 中,其中每个标签都有一个条目(D_ID 是 tblDataDef ID,TAG_ID 是 tblTags ID)。
例如,假设我的第一个条目有标签(“a”、“b”、“c”)。以下将表示:
tblDataDef| **ID=1**
tblDataTags| ID=47, **D_ID=1**, *TAG_ID=1*
tblDataTags| ID=48, **D_ID=1**, *TAG_ID=2*
tblDataTags| ID=49, **D_ID=1**, *TAG_ID=3*
tblTags| *ID=1*, TAG="a"
tblTags| *ID=2*, TAG="b"
tblTags| *ID=3*, TAG="c"
我需要创建一个新的列/字段,其中包含与 tblDataDef 中的每个 ID 关联的所有标签的逗号分隔字符串。因此,对于上面的示例,新字段将填充“a,b,c”。我这样做是为了在 tkinter 中填充 TreeView 列。
我当前的方法需要一点时间,因为它在遍历 tblDataDef ID 时会执行数千次查询。有更快的方法吗?谢谢!!
正在加载 tblDataDef 数据:
def load_data():
conn = pyodbc.connect(strConn)
strSQL = "SELECT ID, ITEM, DESCRIP FROM tblDataDef"
df = pd.read_sql_query(strSQL, conn)
conn.close()
return df
正在加载标签(对于来自 tblDataDef 的单个 ID):
def load_data_tags(series):
conn = pyodbc.connect(strConn)
strSQL = ("SELECT tblTags.TAG "
"FROM tblDataTags "
"LEFT JOIN tblTags ON tblDataTags.TAG_ID=tblTags.ID "
f"WHERE D_ID = {series}")
df = pd.read_sql_query(strSQL, conn)
conn.close()
return df
用数据填充 tkinter 的 TreeView:
df = load_data()
for i, r in df.iterrows():
_id = self.tree.insert("", index="end")
self.tree.set(_id, column="ID", value=r["ID"])
self.tree.set(_id, column="Item", value=r["ITEM"])
self.tree.set(_id, column="Description", value=r["DESCRIP"])
tags = load_data_tags(r["ID"])
tags = tags["TAG"].values.tolist()
tags = ";".join(tags)
self.tree.set(_id, column="Tags", value=tags)
【问题讨论】:
标签: python sql python-3.x tkinter