我想要执行一个 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"
这将如何完成?
为了澄清这个问题,我想我正在从此函数中寻找以下信息:
- 给定表中的所有列名称是什么?
- 它们在外键关系中引用哪些表以及能够连接的关系是什么?
此外,请注意,并非所有 orderitem
都会有 title
,因此执行任何类型的 INNER JOIN
都会删除数据。
最佳答案
在 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]
然后您可以使用上面的所有数据生成查询
关于python - 如何在所有外键之后执行 SELECT *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33311891/