我试图用postpres连接dplyr函数
my_db <- src_postgres(dbname = 'mdb1252', user = "diego", password = "pass")
my_db
src: postgres 9.2.5 [postgres@localhost:5432/mdb1252]
tbls: alf, alturas, asociad, atenmed, base, bfa_boys_p_exp, bfa_boys_z_exp,
bfa_girls_p_exp, bfa_girls_z_exp, bres, c21200012012, c212000392011, c212000532011,
c21200062012, c212006222012, c212007352012, c212012112013, c212012242012,
c212012452012, c2222012242012, calles, cap, cap0110, casos_tbc_tr09, casos_tbctr09,
casosvadela, catpo, cbcvl, cie09, cie10, cie103d, cie103dantigua, cie10c, cie9a,
cie9mc, clasiarc, coalc, coddepto, codedades, codest, codlocaerbio, codprov, coheb,
cohec, cohep, cohiv, coho09_20110909_m, coign, combl, comet, comp, comport, conev,
conymad, copri, corci3cod, corci910, cores, corin, cotab, cutoi, cutto, …Run Code Online (Sandbox Code Playgroud) 我在Windows机器上运行R,它直接链接到PostgreSQL数据库.我没有使用RODBC.我的数据库以UTF-8编码,由以下R命令确认:
dbGetQuery(con, "SHOW CLIENT_ENCODING")
# client_encoding
# 1 UTF8
Run Code Online (Sandbox Code Playgroud)
但是,当一些文本被读入R时,它在R中显示为奇怪的文本.
例如,我的PostgreSQL数据库中显示以下文本:"Stéphane"
出口至R之后它表现为:"STA©PHANE"(该é被编码为é)
导入RI时,使用dbConnect命令建立连接,dbGetQuery使用SQL查询数据的命令.连接到数据库或运行查询时,我没有在任何地方指定任何文本编码.
我在网上搜索过,找不到直接解决我的问题的方法.我找到了这个链接,但他们的问题是RODBC,我没有使用.
此链接有助于识别符号,但我不只是想在R ...中查找和替换太多数据.
我确实尝试在下面运行以下命令,然后发出警告.
Sys.setlocale("LC_ALL", "en_US.UTF-8")
# [1] ""
# Warning message:
# In Sys.setlocale("LC_ALL", "en_US.UTF-8") :
# OS reports request to set locale to "en_US.UTF-8" cannot be honored
Sys.setenv(LANG="en_US.UTF-8")
Sys.setenv(LC_CTYPE="UTF-8")
Run Code Online (Sandbox Code Playgroud)
警告发生在Sys.setlocale("LC_ALL", "en_US.UTF-8")命令上.我的直觉是这是Windows特定的问题,并且在Mac/Linux/Unix中不会发生.
使用时RPostgreSQL我发现我不能sqldf以同样的方式使用.例如,如果我使用以下代码加载库并将数据读入数据框:
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host="localhost", user="postgres", password="xxx", dbname="yyy", port="5436")
rs <- dbSendQuery(con, "select * from table");
df<- fetch(rs, n = -1); dbClearResult(rs)
dbDisconnect(con)
Run Code Online (Sandbox Code Playgroud)
我知道在数据帧中有这个表的内容df.但是,如果我想使用sqldf我以前执行的命令运行SQL命令:
sqldf("SELECT * FROM df WHERE X > 10")
Run Code Online (Sandbox Code Playgroud)
这不再有效,因为我收到错误消息:
Error in postgresqlNewConnection(drv, ...) :
RS-DBI driver: (could not connect postgres@localhost on dbname "test"
)
Error in !dbPreExists : invalid argument type
Run Code Online (Sandbox Code Playgroud)
我认为这是我操作员的错误,但我无法确定如何提供哪些参数,sqldf以便它只关注数据框并且不会尝试连接到其他任何东西.
我有RHEL 6.5服务器,安装了R(3.1.1)和RStudioServer(0.98.1062)
我安装了postgresql-9.3并处理了一个大型数据库.为了将R连接到PostgreSQL,我过去使用过RPostgreSQL(仍在我的CentOS 7工作站上).但是,尝试在RHEL 6.5下编译我得到一个错误
In file included from RS-PQescape.c:7:
RS-PostgreSQL.h:23:26: error: libpq-fe.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
该文件位于我的系统上:
/usr/pgsql-9.3/include/libpq-fe.h
Run Code Online (Sandbox Code Playgroud)
Libpq是Postgres安装的一部分,但RPostgreSQL无法找到它:
[root@server /]# yum list libpq*
Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
Installed Packages
libpqxx.x86_64 1:4.0.1-1.rhel6 @pgdg93
libpqxx-debuginfo.x86_64 1:4.0.1-1.rhel6 @pgdg93
libpqxx-devel.x86_64 1:4.0.1-1.rhel6 @pgdg93
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉RPostgreSQL在哪里看(符号链接?)或其他一些解决方法?这应该很简单,但我已经浪费了好几个小时......
当我在R中尝试linux时
install.packages('RPostgreSQL')
Run Code Online (Sandbox Code Playgroud)
它因未指定的错误而失败:
Warning message:
In install.packages("RPostgreSQL") :
installation of package ‘RPostgreSQL’ had non-zero exit status
Run Code Online (Sandbox Code Playgroud)
我试图解决问题:
sudo apt-get install postgresql-server-dev-8.4 for postgresql version 8.4.
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用.
sudo: apt-get: command not found
Run Code Online (Sandbox Code Playgroud)
我有PostgreSQL 9.1.11版本.
我需要在某些PostgreSQL数据库表的其他列上更新条件值conditionnaly .我设法在R中编写一个SQL语句并dbExecute从DBI包中执行它.
library(dplyr)
library(DBI)
# Establish connection with database
con <- dbConnect(RPostgreSQL::PostgreSQL(), dbname = "myDb",
host="localhost", port= 5432, user="me",password = myPwd)
# Write SQL update statement
request <- paste("UPDATE table_to_update",
"SET var_to_change = 'new value' ",
"WHERE filter_var = 'filter' ")
# Back-end execution
con %>% dbExecute(request)
Run Code Online (Sandbox Code Playgroud)
是否可以仅使用dplyr语法执行此操作?出于好奇,我试过了
con %>% tbl("table_to_update") %>%
mutate(var_to_change = if (filter_var == 'filter') 'new value' else var_to_change)
Run Code Online (Sandbox Code Playgroud)
它在R中工作但显然在db中没有任何作用,因为它使用了一个select语句.copy_to只允许append和overwite选项,所以我看不到如何使用它,除非删除然后附加过滤后的观察...
我正在尝试将数据插入到预先存在的PostgreSQL表中RPostgreSQL,我无法弄清楚SQL参数的语法(预处理语句).
例如,假设我想要做以下事情
insert into mytable (a,b,c) values ($1,$2,$3)
如何指定参数? dbSendQuery如果你只是把参数放在中,似乎不明白....
我发现dbWriteTable可以用来转储整个表,但是不允许你指定列(因此对默认值没有好处等).无论如何,一旦我获得了数据,我就需要知道其他查询(所以我认为这不是真正的插入特定的)!
当然,我只是遗漏了一些明显的东西......
的dbWriteTable在功能上RPostgreSQL似乎忽略的列名,并试图自R将数据推到PostgreSQL原样.当附加到现有表时,这是有问题的,特别是如果在R对象中未指定的列应该给出默认值.
RMySQL通过添加列名来非常优雅地处理这种情况LOAD DATA LOCAL INFILE.如何强制RPostgreSQL在dbWriteTable何时将默认值分配给未指定的列append=TRUE?
这是一个例子:
CREATE TABLE test (
column_a varchar(255) not null default 'hello',
column_b integer not null
);
insert into test values (DEFAULT, 1);
Run Code Online (Sandbox Code Playgroud)
产生下表:
select * from test;
column_a | column_b
----------+----------
hello | 1
(1 row)
Run Code Online (Sandbox Code Playgroud)
我想从R中向该表插入一些新数据:
require('RPostgreSQL')
driver <- PostgreSQL()
con <- dbConnect(driver, host='localhost', dbname='development')
set.seed(42)
x <- data.frame(column_b=sample(1:100, 10))
dbWriteTable(con, name='test', value=x, append=TRUE, row.names=FALSE)
dbDisconnect(con)
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
Error in postgresqlgetResult(new.con) :
RS-DBI driver: (could …Run Code Online (Sandbox Code Playgroud) 我在Windows上使用R连接到AWS上托管的PostgreSQL数据库.使用forcessl = 1设置数据库 - 这意味着需要使用sslmode = require设置任何连接.
基础RPostgreSQL包不提供任何ssl选项的暴露.这已成为一个问题多次(见这里,这里,这里和这里)
我知道有使用该RPostgres软件包的解决方法,但出于其他功能原因,我更喜欢使用该RPostgreSQL软件包.
一些答案(例如这里)建议使用修改后的dbname连接ssl,如下所示:
dbConnect(dbDriver('PostgreSQL'),
dbname = 'dbname=foobar sslmode=require', # modified dbname
host = 'foobar.rds.amazonaws.com',
port = 5439,
user = 'foobar',
password = 'foobar')
Run Code Online (Sandbox Code Playgroud)
但这对我来说不适用于使用CRAN版本的软件包.这导致我最近在RPostgreSQL github上提出了一个问题:https://github.com/tomoakin/RPostgreSQL/issues/88
初始用户在从源代码编译包时能够使用修改后的dbname方法.在Windows上,使用使用RTools编译的最新源包(0.6.2),运行修改后的dbname代码时出现以下错误:
Error in postgresqlNewConnection(drv, ...) :
RS-DBI driver: (could not connect xxxxx.rds.amazonawss.com:5432 on dbname "xxxxxxx": sslmode value "require" invalid when SSL support is not compiled in
)
Run Code Online (Sandbox Code Playgroud)
从这个和线程的其余部分看,在Windows和Mac中看起来无法从当前源获得SSL.但是,开发人员建议:
如果在libssl和libpq成为SSL激活形式的环境中编译,则驱动程序可以使用SSL. …
我正在尝试在 R 中使用 PostgreSQL 的大对象(https://www.postgresql.org/docs/10/largeobjects.html{DBI} )功能,但使用/编写和读取时遇到一些问题{RPostgres}。
这是我到目前为止所尝试过的:
# Getting the db
docker run --rm --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5433:5432 postgres
Run Code Online (Sandbox Code Playgroud)
library(DBI)
con <- dbConnect(
RPostgres::Postgres(),
dbname = "postgres",
host = "localhost",
port = 5433,
user = "postgres",
password = "mysecretpassword"
)
Run Code Online (Sandbox Code Playgroud)
创作作品:
> dbGetQuery(con, "SELECT lo_create(1234);")
lo_create
1 1234
Run Code Online (Sandbox Code Playgroud)
但后来我很难弄清楚如何将 R 对象写入这个大对象。例如,我如何在 Postgres 中使用and编写mtcars一个大对象?{DBI}{RPostgres}
然后,我如何在 R 中再次读回它?