社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Cuteufo • 3 年前 • 1405 次点击  

我正在使用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
 
1405 次点击  
文章 [ 1 ]  |  最新文章 3 年前
forpas
Reply   •   1 楼
forpas    4 年前

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 列出,因为它们不需要。