我想通过使用
以下是一个查询示例,用于说明这些数据库:
使用
我尝试过:
但这似乎不对。我想我必须以某种方式将
SHOW CREATE TABLE db.table
、SHOW CREATE TABLE db1.mytable
或SHOW CREATE TABLE db2.sometable
或SHOW CREATE TABLE db3.mytable1
来提取我50个MySQL数据库中所有Create Statements
。因此,每个DB都有一些表,如db1(table, mytable...), db2(table1, sometable)等
。以下是一个查询示例,用于说明这些数据库:
SELECT *
FROM db.table1 m
LEFT JOIN db1.sometable o ON m.id = o.id
LEFT JOIN db2.sometables t ON p.id=t.id
LEFT JOIN db3.sometable s ON s.column='john'
library(RMySQL)
library(DBI)
con <- dbConnect(RMySQL::MySQL(),
username = "",
password = "",
host = "",
port = 3306,
dbname= mydbname)# when using dbs<-dbGetQuery(con ,"SHOW DATABASES") I have to ## dbname= mydbname## to get all DBs
使用
dbs<-dbGetQuery(con ,"SHOW DATABASES")
,我可以将dbConnection中的所有50个数据库提取为字符向量。我想循环遍历dbs
中的每个DB,并对每个行/数据库应用SHOW CREATE TABLE
。我想我必须将每个行/数据库解析为dbname= mydbname
和dbs<-dbGetQuery(con ,"SHOW CREATE TABLE")
。但我就是无法想出如何制作循环。我尝试过:
apply(dbs, 1, function(row) {
dbname <- row[]
for (i in 1:length(dbname)) {
create<-dbGetQuery(con,"SHOW CREATE TABLE") }
})
但这似乎不对。我想我必须以某种方式将
con
包含在循环中。否则,我会得到以下错误:Error in .local(drv, ...) : object 'dbname' not found
所以我尝试了:apply(dbs, 1, function(row) {
dbname <- row[]
for (i in 1:length(dbname)) {
con <- dbConnect(RMySQL::MySQL(),
username = "",
password = "",
host = "",
port = 3306,
dbname= [i])
create<-dbGetQuery(con,"SHOW CREATE TABLE") }})
我想这已经接近解决方案了,但是我还缺少一些东西:
dbs<-dbGetQuery(con,"show databases")
library(foreach)
foreach(i = 1:(length(dbs))%dopar%{
query<-paste("SHOW CREATE TABLE",dbs[i])
creates<-dbGetQuery(con,query)
})
stmtsdf <- do.call(rbind, createstmts)
的问题吗?我的creatstmts
非常大,几乎有2MB,我会得到Error in rbind(deparse.level, ...) : numbers of columns of arguments do not match
错误。有没有一般的方法来处理这个问题? - Googmerbind
的数据结构。 - GoogmeCREATE TABLE table
与CREATE TABLE view
具有不同的列和名称,因此do.call()
失败了。我添加了一个WHERE
条件TABLE_TYPE = 'BASE TABLE'
来仅拉取表格。 - Parfait