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

标签 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"

这将如何完成?

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

  • 给定表中的所有列名称是什么?
  • 它们在外键关系中引用哪些表以及能够连接的关系是什么?

此外,请注意,并非所有 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/

相关文章:

python - 如何将 'dynamically' 正则表达式编译为(非)二进制?

python - 我可以获得 python 的完整简单 DialogFlow 示例(当前版本 v2)吗?

mysql - 将从站状态\G 显示到输出文件 '/tmp/slavestatus.txt' 中;

python - 优化字典循环求和值

python - 使用 pywin32 DosDateTimeToTime 解压 DOS 压缩时间

mysql - Docker MySQL 错误 1049 (42000) : Unknown database 'users'

php - 使用php将上传的excel文件转换为csv

sql - SQL Server 2012 的 RANDBETWEEN

mysql - SQL 聚合未执行

mysql - 聚合对比查询