【问题标题】:How to do a SELECT * following all foreign keys如何在所有外键之后执行 SELECT *
【发布时间】:2016-01-23 13:17:32
【问题描述】:

我想做一个 SELECT 语句,它将获取一个表中的所有数据 + 使用 LEFT OUTER JOIN 跟随该表中的所有外键。例如:

`orderitem`
id
name
title_id

`title`
id
name

在上面的例子中,我可以使用以下语句:

SELECT * FROM orderitem LEFT OUTER JOIN title on orderitem.title_id=title.id

有没有办法在不知道表结构的情况下做到这一点?也就是要有如下的函数:

def get_select_statement(table)
    ???

get_select_statement(orderitem)
==> "SELECT * FROM orderitem LEFT OUTER JOIN title on orderitem.title_id=title.id"

如何做到这一点?

为了澄清这个问题,我想我正在从这个函数中寻找以下信息:

  • 给定表中的所有列名是什么?
  • 他们在 ForeignKey 关系中引用了哪些表?能够加入的关系是什么?

此外,请注意并非所有orderitems 都会有title,因此任何形式的INNER JOIN 都会删除数据。

【问题讨论】:

标签: python mysql sql


【解决方案1】:

在 MySQLDB 中,您可以使用 describe statement 检索列名:

DESCRIBE table_name;

以及有关外键的所有信息:

select *
from information_schema.KEY_COLUMN_USAGE
where TABLE_SCHEMA = "schema_name" 
      and TABLE_NAME="table_name" 
      and REFERENCED_TABLE_NAME IS NOT NULL

例如,要评估此查询并在 python 中加载结果,您可以使用 SQLAlchemy 包。

engine = sqlalchemy.create_engine("mysqldb://user:password@host/db")
res = engine.execute("DESCRIBE table_name;")
columns = [row["Field"] for row in res]

res = engine.execute("{}".format(query_for_foreign_keys))
foreign_keys = [row["COLUMN_NAME"] for row in res]
referenced_column_names = [row["REFERENCED_COLUMN_NAME"] for row in res]
referenced_table_names = [row["REFERENCED_TABLE_NAME"] for row in res]

然后您可以使用上面的所有数据生成查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2015-03-06
    相关资源
    最近更新 更多