Py学习  »  Python

python/mysql:从多个表中选择,覆盖结果字典中的重复列

Cuteufo • 2 年前 • 1066 次点击  

我正在使用Python 3.8.5和mysql版本15.1发行版10.4.11-MariaDB进行编码。

我有三张桌子, customer , partner customer_partner ,

  • 顾客 有专栏 customer_id , customer_name , address ;
  • 搭档 有专栏 partner_id , partner_name , 住址 ; (注意 住址 列出现在两个表中,但内容明显不同)
  • 客户与合作伙伴 有专栏 客户识别码 , 合伙人身份证 ,描述一个客户和一个合作伙伴之间的合作关系;

我正在试图获取连接的列 顾客 搭档 适用于 客户识别码 位于包含以下python代码和SQL语句的列表中:

db = connect(...)
cur = db.cursor(dictionary=True)
customer_id_tuple = (1, 2, 3)
sql = f"""SELECT *
    FROM customer, partner, customer_partner
    WHERE 
        customer.customer_id in ({','.join(['%s' for _ in range(len(customer_id_list))])})
        AND customer.customer_id=customer_partner.customer_id 
        AND customer_partner.partner_id=partner.partner_id
    """
cur.execute(sql, customer_id_tuple))
data = cur.fetchall()

在结果字典中 data ,我只看到一个 住址 柱明显地 住址 从…起 搭档 表覆盖了来自 顾客 桌子

除了修改列名,我还有没有更得体的方法来避免这种覆盖行为?比如在列名前面自动插入表名,比如 customer.address partner.address ?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129094
 
1066 次点击  
文章 [ 1 ]  |  最新文章 2 年前
forpas
Reply   •   1 楼
forpas    3 年前

SELECT * ... 当存在冲突的列名时,可能会导致歧义。
应该为冲突的列名设置别名。
还可以为表名设置短别名,以缩短代码并使其更具可读性,并使用它们来限定所有列名。
多年来,您使用的隐式连接语法已经被显式连接语法所取代。
你的代码应该这样写:

sql = f"""
SELECT c.customer_id, c.customer_name, c.address customer_address,
       p.partner_id, p.partner_name, p.address partner_address
FROM customer c
INNER JOIN customer_partner cp ON c.customer_id = cp.customer_id 
INNER JOIN partner p ON cp.partner_id = p.partner_id
WHERE c.customer_id IN ({','.join(['%s' for _ in range(len(customer_id_list))])})
"""

我漏掉了所有的专栏 customer_partner SELECT 列出,因为它们不需要。