我正试图从PostgreSQL转移到MySQL项目。对于MySQL,PHP提供了获取选择查询元数据的良好功能。
mysqli_fetch_field或mysqli_fetch_field_direct函数可以为查询中的每个字段提供以下值
例如,查询字段"id“的示例查询和元数据如下所示:
查询:
从id2 table1 t1中选择id作为
字段"id“的元数据:
mysqli_fetch_field的好处是它能够返回查询中字段和表的别名和原始名称。
当我试图为PostgreSQL模拟这个功能时,我发现PostgreSQL没有mysqli_fetch_field函数,相反,有几个pg_field_*函数,每个pg_field_*函数都为一个字段提供了一个信息。
pg_field_name只返回名称,在本例中它给出了"id2“pg_field_table返回原始表名,例如"table1“pg_field_type返回类型(这里没有问题)pg_field_size返回字段的长度(也可以)显然,如果表/字段在查询中重命名,而pg_field_*函数在查询中重命名,则mysqli_fetch_field函数不提供表/字段的原始名称。
是否有一种方法可以为PostgreSQL中的查询获取“详细”元数据?它可以使用DBMS提供的附加查询或工具,如解释和描述(我也尝试过)或其他任何东西。
发布于 2021-01-09 14:18:43
经过一些研究,我最终确信Postgres和PostreSQL本身都没有提供这样的功能。因此,我可以通过pg_field_*函数和用PHP-SQL-Parser编写的SQL解析器的组合来解决这个问题。
尽管SQL解析器是编写MySQL的,但默认功能适用于我的用例,而且在任何情况下都是可扩展的。
发布于 2021-01-04 10:04:49
您是否投资于Postgres特定的函数API?如果不是,请查看PDO,它为您的数据库提供了一个公共接口,无论它是MySQL还是Postgres。它还提供了一种获取特定列的方法:
$pdo = new PDO(...);
$statement = $pdo->prepare("SELECT foo FROM bar WHERE baz = ?");
$statement->execute([42]);
$foo = $statement->fetchColumn(0);
// $foo is the column value or false还可以获取所有结果行的列值:
$foos = $statement->fetchAll(\PDO::FETCH_COLUMN, 0);
// $foos is an array, possibly empty请注意,fetchAll会引起通常的内存损失,因为可能会有较大的结果加载到您的进程中。只有当已知的结果集总是很小时,才应该使用fetchAll。否则,在循环中使用fetch或fetchColumn,并使用LIMIT n, m子句对查询进行页。
如果只查询一个列,则获取特定列是资源友好的。当查询中有其他列时,仍会将它们提取到您的进程中,以便丢弃。您应该确保不包括任何不必要的列。
对于列元数据,请使用getColumnMeta
$meta = $statement->getColumnMeta(0);
// $meta is false or array{native_type, driver:decl_type, flags, name, table, len, precision, pdo_type}要获得更详细的元数据,您应该查询到schema.columns。最好在数据查询之前执行,因为数据查询可能在循环中执行。元数据只需要事先获取一次。
https://stackoverflow.com/questions/65560150
复制相似问题