0

我正在使用 RPostgreSQL 和 sqldf 包执行 SQL。

联系:

drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname="dbname",host="host",port=5432,user="usr",password="pwd")

然后我构建了一个非常复杂的 SQL 语句,最后我得到了(vSQL是 SQL 选择语句):

vSQLDF <- sqldf(vSQL, connection=con)

现在我收到以下错误:

Error in dbPreExists && !overwrite : invalid 'x' type in 'x && y'

我无法创建任何可重现的示例,我只能说:

  1. 生成的 SQL 语句在数据库中直接执行时有效(我已将字符串从 R 复制到 pgAdmin)
  2. 连接有效,我可以使用sqldf("select * from any_table, connection=con")
  3. 当我为我的脚本使用不同的输入参数生成较短的 SQL 时,它可以工作
  4. 仅 SQL 长度不是问题,我尝试过: inSQL = paste(rep("select 1::int ",10000),collapse=" union all "),这会导致不同的错误:RS-DBI driver: (could not Retrieve the result : ERROR: stack depth limit exceeded
  5. 我的 SQL 语句中没有奇怪的字符

知道这个错误是什么意思吗?

会话信息:

> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=cs_CZ.UTF-8       LC_NUMERIC=C               LC_TIME=en_GB.UTF-8        LC_COLLATE=cs_CZ.UTF-8     LC_MONETARY=en_GB.UTF-8   
 [6] LC_MESSAGES=en_US.UTF-8    LC_PAPER=C                 LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] tcltk     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] lattice_0.20-13       sqldf_0.4-6.4         RSQLite.extfuns_0.0.1 RSQLite_0.11.2        chron_2.3-43          gsubfn_0.6-5         
 [7] proto_0.3-10          RPostgreSQL_0.3-3     DBI_0.2-5            

loaded via a namespace (and not attached):
[1] grid_2.15.2  tools_2.15.2

PostgreSQL:

PostgreSQL 9.1.9 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real (Debian 4.4.5-8) 4.4.5, 64-bit

RStudio 0.97.332

4

2 回答 2

1

没有代码和适度的背景细节,这只是一个猜测游戏,但是我没有在任何地方配置SQLDF以使用与默认值不同的驱动程序,并使用适当的选项。您没有提到您已遵循googlecode.com 的 sqldf 页面中与 PostgreSQL 相关的所有说明:

在 sqldf 代码中有一行:

if (request.con) dbPreExists <- attr(connection, "dbPreExists")

您也许可以通过将您的连接对象提供给类似的调用来获得洞察力:

dbPreExists <- attr(connection, "dbPreExists") #see error gets thrown.

您还可以使用以下命令调试 sqldf:

debug(sqldf)  # then repeat operation

将启动一个浏览器会话,您可以单步完成该过程。

于 2013-07-01T16:37:07.947 回答
0

来自 Gabor Grothendieck 的回应:

我认为手动连接从未用 postgres 测试过。如果您想使用 RPostgreSQL,请直接使用它们。

手动和自动连接在带有 sqlite 的 sqldf 中确实有效,而自动连接在带有 RPostgreSQL 的 sqldf 中确实有效。

请参阅他的原始帖子以获取完整的回复。

于 2013-07-02T06:01:31.853 回答