如何在所有外键后执行SELECT *

时间:2015-10-23 21:48:27

标签: python mysql sql

我想做一个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关系中引用了哪些表以及能够加入的关系是什么?

此外,请注意并非所有orderitem都有title,因此执行任何类型的INNER JOIN都会删除数据。

1 个答案:

答案 0 :(得分: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]

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