Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQL:从可能位于另一个表中的列中获取值_Python_Mysql_Sql_Refactoring_Multiple Columns - Fatal编程技术网

Python SQL:从可能位于另一个表中的列中获取值

Python SQL:从可能位于另一个表中的列中获取值,python,mysql,sql,refactoring,multiple-columns,Python,Mysql,Sql,Refactoring,Multiple Columns,我正在工作中进行重构,将一列从一个表移动到另一个表 有一个表表示一个静态的、已连接的(带有物联网设备的)机架 还有一个表表示设备static.iot\u设备 现在,有一些新设备未安装在机架上,因此属性iot\u device\u type\u fk必须从static.connected\u shelf移动到static.iot\u devices 为了防止在我尝试访问此属性时出现争用情况,我需要修改我的查询,以便当它在static.iot_devices中搜索设备类型时,但该列不存在(该环境中尚

我正在工作中进行重构,将一列从一个表移动到另一个表

有一个表表示一个静态的、已连接的(带有物联网设备的)机架

还有一个表表示设备
static.iot\u设备

现在,有一些新设备未安装在机架上,因此属性
iot\u device\u type\u fk
必须从
static.connected\u shelf
移动到
static.iot\u devices

为了防止在我尝试访问此属性时出现争用情况,我需要修改我的查询,以便当它在
static.iot_devices
中搜索设备类型时,但该列不存在(该环境中尚未发生重构),测试不会失败,但是回到
static.connected_shelf
并从那里获取值

下面是一个非常简单的查询示例:

    query = """SELECT c.pk connected_shelf_fk, i.iot_device_type_fk  device_type_fk, i.pk device_fk
               FROM static.connected_shelf c
               JOIN static.iot_devices i ON c.pk = i.connected_shelf_fk
               WHERE i.pk = %(device_id)s"""
    cursor.execute(query, {'device_id': device_id})

因此,在这里,我已经修改了查询,以便它在
static.iot\u devices
中查找
iot\u device\u type\u fk
。如何确保如果该表中不存在此列,我将从
static.connected_shelf
获取该列?

我希望该值位于两个表中,而
NULL
值位于未分配值的表中。如果是:

SELECT c.pk as connected_shelf_fk,
       COALESCE(i.iot_device_type_fk, c.connected_shelf) as iot_device_type_fk,
       i.pk as device_fk,
FROM static.connected_shelf c JOIN
     static.iot_devices i
     ON c.pk = i.connected_shelf_fk
WHERE i.pk = %(device_id)s
如果列确实不存在,可以执行以下操作:

SELECT c.pk as connected_shelf_fk,
       (SELECT iot_device_type_fk  -- no alias!
        FROM static.iot_devices i2
        WHERE i2.pk = i.pk
       ) as iot_device_type_fk,
       i.pk as device_fk,
FROM static.connected_shelf c JOIN
     static.iot_devices i
     ON c.pk = i.connected_shelf_fk
WHERE i.pk = %(device_id)s

子查询将首先在
iot\u devices
中查找
iot\u device\u type\u fk
,然后在
connected\u shelf

中查找
iot\u device\u type\u fk
,我希望两个表中都有该值,在未分配值的表中都有
NULL
值。如果是:

SELECT c.pk as connected_shelf_fk,
       COALESCE(i.iot_device_type_fk, c.connected_shelf) as iot_device_type_fk,
       i.pk as device_fk,
FROM static.connected_shelf c JOIN
     static.iot_devices i
     ON c.pk = i.connected_shelf_fk
WHERE i.pk = %(device_id)s
如果列确实不存在,可以执行以下操作:

SELECT c.pk as connected_shelf_fk,
       (SELECT iot_device_type_fk  -- no alias!
        FROM static.iot_devices i2
        WHERE i2.pk = i.pk
       ) as iot_device_type_fk,
       i.pk as device_fk,
FROM static.connected_shelf c JOIN
     static.iot_devices i
     ON c.pk = i.connected_shelf_fk
WHERE i.pk = %(device_id)s

子查询将首先在
iot\u设备
中查找
iot\u设备
,然后在
connected\u shelf
中查找
。这不是一个规范化的设计。这场比赛的情况会很糟糕。@duffymo你说得对。最后,该列将只在一个表中,但在它周围的所有内容都对齐之前,不可能简单地从旧表中删除它。不要删除。填充新列,更新查询,并让其在新状态下转到prod。确认一切正常后删除旧数据。此信息应仅包含在一列中。这不是一个规范化的设计。这场比赛的情况会很糟糕。@duffymo你说得对。最后,该列将只在一个表中,但在它周围的所有内容都对齐之前,不可能简单地从旧表中删除它。不要删除。填充新列,更新查询,并让其在新状态下转到prod。确认一切正常后删除旧数据。谢谢,但这是不对的。如果我在一个尚未重构的环境中运行此功能,则iot_设备中将不存在该列。如果我在已经重构的环境中运行它,则该列将不存在于connected_shelf中。我需要确保在重构完成之前,测试不会在所有环境中失败。您应该接受这个答案。比比赛条件好。谢谢,但那是不对的。如果我在一个尚未重构的环境中运行此功能,则iot_设备中将不存在该列。如果我在已经重构的环境中运行它,则该列将不存在于connected_shelf中。我需要确保在重构完成之前,测试不会在所有环境中失败。您应该接受这个答案。比比赛条件好。