Após ter criado o mesmo framework, originalmente em PHP, percebi que eu teria a mesma necessidade de um ORM em outras linguagens. Assim como eu precisei quando comecei a utilizar o R em ambiente profissional e, com a praticidade que eu tinha em PHP, resolvi adaptar para R.
Mas, o projeto ainda não está 100% completo, devido ao R não ter um suporte total ao POO.
Através do pacote DBI, é possível realizar uma conexão com vários tipos de banco de dados. Além disso, por meio do Generics
, é possível acessar o conteúdo de um objeto e obter todas as informações necessárias para criar uma instrução SQL.
Neste caso, uma classe deve seguir o seguinte modelo:
ClasseTeste <- methods::setRefClass(
# Nome da Tabela
"nome_do_campo",
# Campos da Tabela
fields = list(
# Aqui você precisa informar o tipo do
# campo no banco de dados, seguindo os tipos de dados do R
nome_do_campo = "character"
)
)
Para que você possa utilizar todos as funcionalidades do framework no seu ambiente, você pode criar 1 (ou mais, dependendo da sua forma de trabalho) classe para acessar ao banco de dados de forma genérica.
ModelDataAccess <- methods::setRefClass(
"ModelDataAccess",
methods = list(
initialize = function() {
tryCatch({
databaseFactory <- rarframeworkR:::DatabaseFactory$new()
databaseFactory$getDataContextInstance()
}, error = function (ex) {
stop (ex$message)
})
},
create = function(obj) {
tryCatch({
sqlStatement <- rarframeworkR:::SqlStatementInsert$new(obj);
commandContext <- rarframeworkR:::CommandContext$new(sqlStatement$getSql());
commandContext$executeQuery()
}, error = function (ex) {
stop (ex$message)
})
},
save = function(obj) {
tryCatch({
sqlStatement <- rarframeworkR:::SqlStatementUpdate$new(obj);
commandContext <- rarframeworkR:::CommandContext$new(sqlStatement$getSql());
commandContext$executeQuery()
}, error = function (ex) {
stop (ex$message)
})
},
find = function(obj) {
tryCatch({
sqlStatement <- rarframeworkR:::SqlStatementSelect$new(obj);
objContext <- rarframeworkR:::ObjectContext$new(obj);
commandContext <- rarframeworkR:::CommandContext$new(sqlStatement$getSql(FALSE));
return (objContext$getObject(commandContext$executeReader()))
}, error = function (ex) {
stop (ex$message)
})
},
findAll = function(obj) {
tryCatch({
sqlStatement <- rarframeworkR:::SqlStatementSelect$new(obj);
objContext <- rarframeworkR:::ObjectContext$new(obj);
commandContext <- rarframeworkR:::CommandContext$new(sqlStatement$getSql(TRUE));
return (objContext$getObjects(commandContext$executeReader()))
}, error = function (ex) {
stop (ex$message)
})
},
remove = function(obj) {
tryCatch({
sqlStatement <- rarframeworkR:::SqlStatementDelete$new(obj);
commandContext <- rarframeworkR:::CommandContext$new(sqlStatement$getSql());
commandContext$executeQuery()
}, error = function (ex) {
stop (ex$message)
})
}
)
)
OBS.: Você não precisa criar a classe de forma genérica, você pode criar uma classe de acesso a dados para cada entidade que você criar no modelo citado acima.
E para que o ORM consiga se conectar com o banco de dados, você precisa criar um arquivo de configuração com o nome: databaseConfig.json
e ele deve seguir o modelo abaixo:
{
"host" : "localhost",
"port" : 3306,
"user" : "root",
"pwd" : "123",
"db" : "foo",
"type" : "mysql"
}
OBS.: Neste modelo, estamos informando um banco MySQL.
Para contribuir, você pode realizar um fork do nosso repositório e nos enviar um Pull Request.
Caso queria fazer uma doação para o projeto, você pode realizar aqui
Caso você tenha algum problema ou uma sugestão, você pode nos contatar aqui.
Cheque aqui
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.