dbPreExists中的错误&& !覆盖:'x&&中的无效'x'类型Y”

时间:2013-07-01 14:20:58

标签: r postgresql sqldf rpostgresql

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

连接:

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

然后我构建了一个非常复杂的SQL语句,最后我有(vSQL是SQL select语句):

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. 当我使用脚本
  4. 的不同输入参数生成更短的SQL时,它可以正常工作
  5. SQL长度不是问题,我尝试过:inSQL = paste(rep("select 1::int ",10000),collapse=" union all "),导致不同的错误:RS-DBI driver: (could not Retrieve the result : ERROR: stack depth limit exceeded
  6. 我的SQL语句中没有奇怪的字符
  7. 知道这个错误意味着什么吗?

    会话信息:

    > 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

2 个答案:

答案 0 :(得分:1)

如果没有代码和适量的背景细节,这只是一个猜谜游戏,但我看到你没有配置sqldf使用不同的驱动程序而不是默认的适当选项。您没有提到您已遵循sqldf page at googlecode.com:

中与PostgreSQL相关的所有说明

在sqldf代码中有一行:

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

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

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

您也可以使用以下方法调试sqldf:

debug(sqldf)  # then repeat operation

将启动浏览器会话,您可以单步执行该过程。

答案 1 :(得分:0)

来自Gabor Grothendieck的

Response

  

我不认为手动连接曾经用postgres测试过。使用   如果你想使用它们,直接使用RPostgreSQL。

     

手动和自动连接在sqldf中使用sqlite和   自动连接在sqldf中与RPostgreSQL一起工作。

查看他原来的帖子,了解整个回复。