首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP - mysqli_fetch_field等价于PostgreSQL

问PHP - mysqli_fetch_field等价于PostgreSQL
EN

Stack Overflow用户
提问于 2021-01-04 09:11:31
回答 2查看 267关注 0票数 0

我正试图从PostgreSQL转移到MySQL项目。对于MySQL,PHP提供了获取选择查询元数据的良好功能。

mysqli_fetch_field或mysqli_fetch_field_direct函数可以为查询中的每个字段提供以下值

  • 名字
  • 奥格尼姆
  • 表格
  • orgtable
  • max_length
  • 长度
  • 类型
  • (还有其他几个我目前不感兴趣的)

例如,查询字段"id“的示例查询和元数据如下所示:

查询:

从id2 table1 t1中选择id作为

字段"id“的元数据:

  • 名称: id2
  • 组织名称: id
  • 表: t1
  • orgtable : table1
  • 长度: 765
  • 类型: 253

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提供的附加查询或工具,如解释和描述(我也尝试过)或其他任何东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-09 14:18:43

经过一些研究,我最终确信Postgres和PostreSQL本身都没有提供这样的功能。因此,我可以通过pg_field_*函数和用PHP-SQL-Parser编写的SQL解析器的组合来解决这个问题。

尽管SQL解析器是编写MySQL的,但默认功能适用于我的用例,而且在任何情况下都是可扩展的。

票数 0
EN

Stack Overflow用户

发布于 2021-01-04 10:04:49

您是否投资于Postgres特定的函数API?如果不是,请查看PDO,它为您的数据库提供了一个公共接口,无论它是MySQL还是Postgres。它还提供了一种获取特定列的方法:

代码语言:javascript
复制
$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

还可以获取所有结果行的列值:

代码语言:javascript
复制
$foos = $statement->fetchAll(\PDO::FETCH_COLUMN, 0);
// $foos is an array, possibly empty

请注意,fetchAll会引起通常的内存损失,因为可能会有较大的结果加载到您的进程中。只有当已知的结果集总是很小时,才应该使用fetchAll。否则,在循环中使用fetch或fetchColumn,并使用LIMIT n, m子句对查询进行页。

如果只查询一个列,则获取特定列是资源友好的。当查询中有其他列时,仍会将它们提取到您的进程中,以便丢弃。您应该确保不包括任何不必要的列。

对于列元数据,请使用getColumnMeta

代码语言:javascript
复制
$meta = $statement->getColumnMeta(0);
// $meta is false or array{native_type, driver:decl_type, flags, name, table, len, precision, pdo_type}

要获得更详细的元数据,您应该查询到schema.columns。最好在数据查询之前执行,因为数据查询可能在循环中执行。元数据只需要事先获取一次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65560150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档