如何使用 RODBC 将数据帧保存到数据库生成的主键表

2024-05-13

我想使用 R 脚本将数据框输入到数据库中的现有表中,并且希望数据库中的表具有顺序主键。我的问题是 RODBC 似乎不允许主键约束。

这是创建我想要的表的 SQL:

CREATE TABLE [dbo].[results] (
    [ID]         INT            IDENTITY (1, 1) NOT NULL,
    [FirstName]  VARCHAR (255) NULL,
    [LastName]   VARCHAR (255) NULL,
    [Birthday]   DATETIME      NULL,
    [CreateDate] DATETIME      NULL,
    CONSTRAINT [PK_dbo.results] PRIMARY KEY CLUSTERED ([ID] ASC)
);

并使用一些 R 代码进行测试:

ConnectionString1="Driver=ODBC Driver 11 for SQL Server;Server=myserver; Database=TestDb; trusted_connection=yes"
ConnectionString2="Driver=ODBC Driver 11 for SQL Server;Server=notmyserver; Database=TestDb; trusted_connection=yes"
db1=odbcDriverConnect(ConnectionString1)    
query="SELECT a.[firstname] as FirstName
  , a.[lastname] as LastName
  , Cast(a.[dob] as datetime) as Birthday
  , cast(a.createDate as datetime) as CreateDate
FROM [dbo].[People] a"
results=NULL
results=sqlQuery(db1,query,stringsAsFactors=FALSE)
close(db1)

db2=odbcDriverConnect(ConnectionString)
sqlSave(db2, 
    results, 
    append = TRUE, 
    varTypes=c(Birthday="datetime", CreateDate="datetime"),
    colnames = FALSE,  
    rownames = FALSE,fast=FALSE)
close(db2)

R 代码的第一部分只是将一些测试数据放入数据帧中 - 它工作正常,这不是我的问题的一部分(我只是将其包含在此处,以便您可以看到测试数据的格式)。当我运行sqlSave函数我收到一条错误消息:

dimnames(x)

但是,如果我从数据库中删除主键,则该表的一切正常:

CREATE TABLE [dbo].[results] (
    [FirstName]  VARCHAR (255) NULL,
    [LastName]   VARCHAR (255) NULL,
    [Birthday]   DATETIME      NULL,
    [CreateDate] DATETIME      NULL
);

显然主键是问题所在。通常,使用实体框架或其他框架(据我了解),当您输入数据时,主键是在数据库中创建的。

我想要一种仅使用 R 脚本将数据附加到具有主键的表的方法。那可能吗?我要添加到的表中可能已经有数据,因此在尝试附加到表之前,我确实没有找到在 R 中创建键的方法。


问题出在第361行http://github.com/cran/RODBC/blob/master/R/sql.R http://github.com/cran/RODBC/blob/master/R/sql.R- data.frame 和数据库表必须具有完全相同的列数,否则您会在堆栈跟踪中收到此错误:

Error in dimnames(x) <- dn : 
  length of 'dimnames' [2] not equal to array extent 
3. `colnames<-`(`*tmp*`, value = c("ID", "FirstName", "LastName", 
   "Birthday", "CreateDate")) at sql.R#361
2. sqlwrite(channel, tablename, dat, verbose = verbose, fast = fast, 
   test = test, nastring = nastring) at sql.R#211
1. sqlSave(db2, results, append = TRUE, varTypes = c(Birthday = "datetime", 
    CreateDate = "datetime"), colnames = FALSE, rownames = FALSE, 
    fast = FALSE, verbose = TRUE) 

如果您将 ID 列添加到data.frame你不能再使用autoincID 列,因此这不是解决方案(或解决方法)。

解决“相同列”限制的“简单”解决方法RODBC::sqlSave is:

  1. Use sqlSave将新行保存到另一个表名中
  2. Send an insert into ... select from ... via RODBC::sqlQuery将新行追加到包含 autoinc ID 的原始表中 柱子
  3. 再次删除包含新行的表(drop table...)

更好的选择是使用新的odbc该包还通过批量插入而不是发送单个插入来提供更好的性能insert类似的陈述RODBC does:

https://github.com/r-dbi/odbc https://github.com/r-dbi/odbc

寻找函数dbWriteTable(这是接口的实现DBI::dbWriteTable).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 RODBC 将数据帧保存到数据库生成的主键表 的相关文章

随机推荐

  • Gulp 错误:找不到模块“jshint/src/cli”

    因此 我重新安装了 El Capitan 并再次尝试这些任务运行程序 我正在跟进sitepoint 的 Gulp js 简介 http www sitepoint com introduction gulp js 但当我尝试运行时 我陷入了
  • 没有带有张量板的图表

    我正在读一本关于 Tensorflow 的书 我发现了这段代码 from future import absolute import from future import division from future import print
  • System.Web.Mvc.HtmlHelper 不包含以下定义

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 关于编辑可变长度列
  • removeIf 实现细节

    我有一个我无法理解的小实施细节问题ArrayList removeIf 我认为我不能在没有先决条件的情况下简单地这么说 因此 实施基本上是bulk remove 不像ArrayList remove 一个例子应该会让事情更容易理解 假设我有
  • 如何覆盖应用程序中的内部框架方法(框架外部)

    在 Swift 中子类化时是否有重写内部框架方法 前任 超类 public class BarChartRenderer ChartDataRendererBase internal func drawDataSet context con
  • 固定大小集以包含给定集的最大数量

    我有大约 1000 组尺寸 1 4 1 3 3 5 6 4 5 6 7 5 25 42 67 100 是否有可能找到包含最大数量的给定集合的大小为 20 的集合 检查每一个100 80 20 集 效率低下 我不太确定这是 NP 完全的 考虑
  • JOOQ 查询 JOIN ON WITH 子句

    如何编写 JOOQ 查询来连接 with 子句中的字段 例如 我尝试过 create with a as select val 1 as x val a as y select from tableByName a join ANOTHER
  • 如何在android中实现页面翻转/翻转/卷曲效果[重复]

    这个问题在这里已经有答案了 可能的重复 在android上实现页面卷曲 https stackoverflow com questions 3912849 implement page curl on android 如何在android中
  • 在 MongoDB 中,如何根据嵌入对象中的属性对文档进行排序?

    在我的产品集合中 我可以找到已在 GB 地区发布的所有产品 gt db products find release region GB pretty id foo release region GB date ISODate 2012 03
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • Linq 到自定义 SQL

    好的 我有一个带有巨大表的数据库 超过 100 万条记录和 50 多个列 我知道它不是最佳的 但它是我必须处理的 所以我需要运行限制返回数据量的查询 现在我的问题是这样的 我有一些运行并返回数据的自定义查询 用户可以通过选择将生成谓词模板并
  • 别名 .\SQLEXPRESS 为 (LocalDB)\MSSQLLocalDB

    I have SQLEXPRESS已安装 但代码假设我有一个名为 LocalDB MSSQLLocalDB 如何创建别名以便不必安装SQLLocalDb 启动 Sql Server 配置管理器 使用以下参数为 64 位 SQL Native
  • 失败:错误域=NSURLErrorDomain代码=-1004“无法连接到服务器。”

    首先 我想列出我已阅读并尝试实现答案的帖子 避免重复 iOS 9 和 iOS 10 中的应用程序传输安全问题 https stackoverflow com questions 40280936 app transport security
  • 使用 Yew 回调作为 wasm_bindgen 闭包

    这个问题是为 Yew v0 19 编写的 异步外部 JavaScript 函数可以通过以下方式在 Rust 中使用Closures https rustwasm github io wasm bindgen api wasm bindgen
  • 从 exe/as 服务运行 tomcat 时出现 NoClassDefFoundError: org/apache/catalina/startup/Bootstrap

    我已经通过startup bat运行Tomcat 6 0 37服务器相当长一段时间了 现在我想将tomcat作为一项服务运行 在机器启动时自动启动 我使用bat创建了服务 service bat install 这成功地创建了服务 当尝试启
  • Java - Runtime.getRuntime().exec() 发生了什么?

    我在 Java 中遇到 Runtime exec 问题 我的代码 String lol home pc example txt String b touch lol try Runtime getRuntime exec b catch E
  • 使用 libdl 的 C 插件架构

    我一直在尝试用 C 语言编写一个小型 IRC 框架 现在我将扩展它的一些核心功能 但除此之外 我希望它可以通过插件进行扩展 到目前为止 每当我写一些与 IRC 相关的东西 我写了很多东西 现在大约有 6 种不同的语言 我很着火 并且实际上继
  • 如何反思 PEP 484 类型提示?

    我观察到对于以下功能 def foo x int gt List int return x 1 可以使用表达式获取注释信息foo annotations 这产生 x
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • 如何使用 RODBC 将数据帧保存到数据库生成的主键表

    我想使用 R 脚本将数据框输入到数据库中的现有表中 并且希望数据库中的表具有顺序主键 我的问题是 RODBC 似乎不允许主键约束 这是创建我想要的表的 SQL CREATE TABLE dbo results ID INT IDENTITY