小编Wil*_*lem的帖子

如何使用glue_data_sql在SQL Server数据库上编写安全的参数化查询?

问题

我想围绕一些DBI函数编写一个包装器,以允许安全执行参数化查询。我找到了这个资源,它解释了如何使用该glue包将参数插入 SQL 查询。但是,似乎有两种不同的方法可以使用glue包插入参数:

  1. 方法1涉及?在需要插入参数的sql查询中使用use,然后随后使用usedbBind来填充它们。上面链接中的示例:
library(glue)
library(DBI)

airport_sql <- glue_sql("SELECT * FROM airports WHERE faa = ?")
airport <- dbSendQuery(con, airport_sql)

dbBind(airport, list("GPT"))
dbFetch(airport)
Run Code Online (Sandbox Code Playgroud)
  1. 方法 2涉及使用glue_sqlglue_data_sql自行填写参数(不使用dbBind)。还是上面链接中的一个例子:
airport_sql <- 
  glue_sql(
    "SELECT * FROM airports WHERE faa IN ({airports*})", 
    airports = c("GPT", "MSY"),
    .con = con
  )

airport <- dbSendQuery(con, airport_sql)

dbFetch(airport)
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用第二种方法,因为它有很多额外的功能,例如折叠sql 语句子句in中语句的多个值。where请参阅上面的第二个示例了解其工作原理(请注意*参数后面的 表示它必须折叠)。问题是:这对于 SQL …

sql-server r r-dbi

8
推荐指数
0
解决办法
1644
查看次数

为什么 dbListTables 在通过函数调用时会给出警告消息?(R DBI)

我使用 DBI 包中的 dbListTables 编写了一个函数,该函数引发了我无法理解的警告。当我在函数之外运行相同的代码时,我没有收到警告消息。

有关信息,使用的数据库是 Microsoft SQL Server。

可重现的例子

library(odbc)
library(DBI)

# dbListTables in a function: gives a warning message

dbListTablesTest <- function(dsn, userName, password){

  con <- dbConnect(
    odbc::odbc(),
    dsn      = dsn,
    UID      = userName,
    PWD      = password,
    Port     = 1433,
    encoding = "latin1"
  )

  availableTables <- dbListTables(con)
}

availableTables <- 
  dbListTablesTest(
    dsn = "myDsn"
    ,userName = myLogin
    ,password = myPassword
  )

# dbListTables not within a function works fine (no warnings)

con2 <- dbConnect(
  odbc::odbc(),
  dsn      = "myDsn", …
Run Code Online (Sandbox Code Playgroud)

sql-server odbc r r-dbi

5
推荐指数
1
解决办法
1071
查看次数

如何正确使用sqlAppendTable?

简短的摘要

我正在尝试使用该包将 R data.frame 中的数据插入 SQLServer 数据库上的表中DBI。在阅读了有关 sqlAppendTable 的信息后,我希望这个函数可以帮助我生成必要的 SQL 语句。然而,这个函数似乎没有将字符串放在字符变量周围,因此在尝试执行它时会产生错误。我使用正确吗?我应该为此目的使用此功能吗?如果没有,您能推荐另一种方法吗?

我的代码

library(odbc)
library(DBI)

con <- dbConnect(
    odbc::odbc(),
    dsn      = myDsn,
    UID      = myLogin,
    PWD      = myPwd,
    Port     = 1433,
    encoding = "latin1"
  )

insertStatement <- sqlAppendTable(
    con,
    "DBtable",
    myDataFrame,
    row.names = FALSE
  )

dbExecute(
  con,
  insertStatement
)

dbDisconnect(con)
Run Code Online (Sandbox Code Playgroud)

数据库表“DBtable”有 3 列,每列的类型为varchar。data.frame“myDataFrame”也有 3 列类型,character具有相同的名称和相同的顺序。

问题

sqlAppendTable生成一个 SQL 语句,其中字符变量不带引号,即以下形式的输出:

<SQL> INSERT INTO "DBtable"
  ("col1", "col2", "col3")
VALUES
  (Value one one, Value one …
Run Code Online (Sandbox Code Playgroud)

odbc r insert r-dbi

5
推荐指数
1
解决办法
1712
查看次数

使用 pyspark 计算日期之间的天数,忽略周末

如何使用 计算忽略周末的两个日期之间的天数pyspark

这与这里的问题完全相同,只是我需要这样做pyspark

我尝试使用udf

import numpy as np
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType

@udf(returnType=IntegerType())
def dateDiffWeekdays(end, start):
    return int(np.busday_count(start, end)) # numpy returns an `numpy.int64` type.

Run Code Online (Sandbox Code Playgroud)

使用此 udf 时,我收到一条错误消息:

ModuleNotFoundError:没有名为“numpy”的模块

有谁知道如何解决这个问题?udf或者更好的是,在没有原生的情况下解决这个问题pyspark

编辑:我已经numpy安装了。在 a 之外udf它工作得很好。

python pyspark

4
推荐指数
1
解决办法
5498
查看次数

标签 统计

r ×3

r-dbi ×3

odbc ×2

sql-server ×2

insert ×1

pyspark ×1

python ×1