8.2 odbc包
官方说明:The goal of the odbc package is to provide a DBI-compliant interface to Open Database Connectivity (ODBC) drivers. This allows for an efficient, easy to setup connection to any database with ODBC drivers available, including SQL Server, Oracle, MySQL, PostgreSQL, SQLite and others. The implementation builds on the nanodbc C++ library。
odbc可以运用于包括(SQL Server, Oracle, MySQL,PostgreSQL,SQLite)等odbc驱动程序于DBI
兼容的接口,相比起来DBI
包适用范围更广。
8.2.1 安装包
- Windows
Windows与ODBC库捆绑在一起,但是每个数据库的驱动程序需要单独安装。windows系统上可以通过以下命令直接安装。
#安装包
install.packages('odbc')
- 其它系统
其它系统在安装前需要安装依赖环境,如下所示:
# Macos
brew install unixodbc
# Debian /Ubuntu
apt-get install unixodbc unixodbc-dev
8.2.2 驱动安装
由于Win系统绑定ODBC库,不需要安装依赖环境即可正常安装使用R包odbc,其它系统经过上面依赖环境安装,现在系统已经能正常安装odbc包。
最后通过odbc::odbcListDrivers()
查看系统上是否存在可用驱动程序。
查看可用系统可用驱动:
head(odbc::odbcListDrivers())
#> name attribute value
#> 1 SQL Server APILevel 2
#> 2 SQL Server ConnectFunctions YYY
#> 3 SQL Server CPTimeout 60
#> 4 SQL Server DriverODBCVer 03.50
#> 5 SQL Server FileUsage 0
#> 6 SQL Server SQLLevel 1
1.Windows
默认情况下,win系统即使不安装也可使用驱动“SQL Server,”如下所示:
如果想要安装最新的SQL Server驱动,该如何安装呢?具体安装教程请查看微软安装说明
win系统最新的SQL Server驱动ODBC Driver 17 for SQL Server下载地址
其它系统上如果安装sql server驱动请参照安装说明
2.Macos
Macos安装驱动
brew install unixodbc
# Microsoft SQL Server ODBC Drivers (Recommended)
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql17 mssql-tools
成功安装后如下所示:
8.2.3 连接数据库
连接数据库需要注意时区、编码,尤其是涉及到时间时区时如果设置有误,可能导致时间数据错误。当你在Win系统上连接Sql Server时,如果你使用的数据库是中文环境时,设置encoding
参数中文将不会乱码。如果是linux上通过odbc连接SqlServer,一般情况下可以不用设置编码,另外设置encoding为gbk会报错。
数据库连接有几种方式,详情请参照数据库连接字符串,我们以SQL Server2019数据库,驱动ODBC Driver 17 for SQL Server
举例。
1.标准模式
连接字符串
Driver={ODBC Driver 17 for SQL Server};Server=myServerAddress;Database=myDataBase;UID=myUsername;PWD=myPassword;
参数形式:
<- odbc::dbConnect(drv=odbc(),driver="ODBC Driver 17 for SQL Server",server='172.16.88.2',database='spb',uid='zhongyf',pwd='Zyf123456',encoding='UTF-8',timezone="Asia/Shanghai") con
字符串形式:
<- odbc::dbConnect(drv = odbc(),.connection_string='Driver={ODBC Driver 17 for SQL Server};Server=172.16.88.2;Database=spb;UID=zhongyf;PWD=Zyf123456;',encoding='UTF-8',timezone="Asia/Shanghai") con
2.信任连接
通过windows身份认证连接,通过数据库管理员配置相关账户权限即可。
Driver={ODBC Driver 17 for SQL Server};Server=myServerAddress;Database=myDataBase;Trusted_Connection=yes;
library(odbc)
<- odbc::dbConnect(odbc(),
con Driver = "SQL Server", Server = "Vega", Database = "ghzy",
Trusted_Connection = "True"
)
3.连接SQL Server实例15
Driver={ODBC Driver 17 for SQL Server};Server=serverName\instanceName;
Database=myDataBase;Trusted_Connection=yes;
4.非标准端口
SQL Server数据库的默认端口是1433,连接非标端口字符串如下所示:
Driver={ODBC Driver 17 for SQL Server};Server=myServerName,myPortNumber;Database=myDataBase;UID=myUsername;PWD=myPassword;
通过配置DSN也可连接数据库,但是这样写的脚本在同事间分享不方便,故不推荐。
win10开始–>运行 打开ODBC数据源(64) 配置。
<- dbConnect(odbc::odbc(), dsn="ghzy")
con dbGetInfo(con) #查看连接信息
$dbname
1] "spb"
[
$dbms.name
1] "Microsoft SQL Server"
[
$db.version
1] "12.00.5203"
[
$username
1] "dbo"
[
$host
1] ""
[
$port
1] ""
[
$sourcename
1] "ghzy"
[
$servername
1] "personalSQL"
[
$drivername
1] "msodbcsql17.dll"
[
$odbc.version
1] "03.80.0000"
[
$driver.version
1] "17.05.0002"
[
$odbcdriver.version
1] "03.80"
[
$supports.transactions
1] TRUE
[
$getdata.extensions.any_column
1] FALSE
[
$getdata.extensions.any_order
1] FALSE
[
attr(,"class")
1] "Microsoft SQL Server" "driver_info" "list" [
8.2.4 读写数据库
1.查询
odbc::dbGetQuery()
函数执行sql语句并返回数据
<- odbc::dbGetQuery(con,'select * from DT')
dt head(dt)
2.写入数据库
::dbWriteTable(con,name = '表名',value = dt,overwrite = T ) # 是否覆盖
odbc::dbWriteTable(con,name = '表名',value = dt,append = T ) # 是否追加 odbc
由于odbc包的函数都是DBI中一些函数的实现,我们将其它的一些函数放在接下来的DBI包中讲解。
综上,我们使用odbc包主要是作为连接开放式数据库(odbc)中介使用。
在一台计算机上可以安装多个SQL Server,每个SQL Server就是一个实例,实例分为默认实例和命令实例。↩︎