PHP使用PDO连接Snowflake数据库查询表报错问题排查
问题根因
你遇到的报错是Snowflake PDO驱动的会话上下文默认值与标识符解析规则共同导致的:
- 无默认数据库的会话中,驱动解析三段式
<数据库>.<Schema>.<表>名称时逻辑异常,会误将前两段整体识别为Schema名称,触发第一个报错 - 两段式
<Schema>.<表>名称要求会话必须配置默认数据库才能正常解析,否则触发第二个报错
你在Snowflake Worksheet中能正常执行语句,是因为Worksheet会默认加载当前用户/角色的默认数据库、Schema配置,PDO连接默认不会主动加载这些参数,需要手动指定。
解决方法
方法1:在DSN连接串中直接配置会话上下文(推荐)
创建PDO连接时直接在DSN中补充数据库、Schema、角色参数,连接后自动完成上下文配置,后续直接使用表名查询即可:
$dbh = new PDO( "snowflake:account=$this->account;database=INTERNAL_STUFF;schema=INTERNAL_TEST;role=你访问该表使用的角色名", $this->user, $this->password ); $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); // 后续直接查询短表名即可 $result = $dbh->query("SELECT * FROM TEST_TABLE_SIMPLE");
方法2:连接后执行USE语句手动配置上下文
如果需要动态切换数据库/Schema,可以在连接完成后手动执行语句配置会话参数:
$dbh = new PDO("snowflake:account=$this->account", $this->user, $this->password); $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); // 手动配置会话上下文 $dbh->exec("USE ROLE 你访问该表使用的角色名"); $dbh->exec("USE DATABASE INTERNAL_STUFF"); $dbh->exec("USE SCHEMA INTERNAL_TEST"); // 后续直接查询短表名即可 $result = $dbh->query("SELECT * FROM TEST_TABLE_SIMPLE");
方法3:全限定名兼容写法
如果坚持要使用三段式全限定名查询,可以给每个标识符加上双引号规避解析异常:
$result = $dbh->query('SELECT * FROM "INTERNAL_STUFF"."INTERNAL_TEST"."TEST_TABLE_SIMPLE"');
内容的提问来源于stack exchange,提问作者Tom Barr
相关产品推荐
相关产品推荐

