Julia 编程 - 数据库

以下是与特定数据库系统交互的四种机制 −

  • 访问数据库的第一种方法是使用 API(应用程序编程接口)中的一组例程。 在此方法中,DBMS 将捆绑为一组查询和维护实用程序。 这些实用程序将通过共享库与正在运行的数据库进行通信,该共享库将进一步作为 API 中的一组例程向用户公开。

  • 第二种方法是通过中间抽象层。 该抽象层将通过驱动程序与数据库 API 进行通信。 此类驱动程序的一些示例包括 ODBC、JDBC 和数据库接口 (DBI)。

  • 第三种方法是针对特定数据库系统使用Python模块。 PyCall 包将用于调用 Python 模块中的例程。 它还将处理 Python 和 Julia 之间的数据类型交换。

  • 第四种方法是向数据库发送消息。 RESTful 是最常见的消息传递协议。

Julia 数据库 API

Julia 提供了多个 API 来与各种数据库提供商进行通信。

MySQL

MySQL.jl是从Julia编程语言访问MySQL的包。

使用以下代码安装MySQL API master版本 −

Pkg.clone("https://github.com/JuliaComputing/MySQL.jl")

示例

要访问 MySQL API,我们需要首先连接到 MySQL 服务器,这可以通过以下代码来完成 −`

using MySQL
con = mysql_connect(HOST, USER, PASSWD, DBNAME)

要使用数据库,请使用以下代码片段创建表 −

command = """CREATE TABLE Employee
         (
            ID INT NOT NULL AUTO_INCREMENT,
            Name VARCHAR(255),
            Salary FLOAT,
            JoinDate DATE,
            LastLogin DATETIME,
            LunchTime TIME,
            PRIMARY KEY (ID)
         );"""
response = mysql_query(con, command)
if (response == 0)
   println("Create table succeeded.")
else
   println("Create table failed.")
end

我们可以使用以下命令来获取 SELECT 查询结果作为 dataframe −

command = """SELECT * FROM Employee;"""
dframe = execute_query(con, command)

我们可以使用以下命令来获取 SELECT 查询结果作为 Julia Array −

command = """SELECT * FROM Employee;"""
retarr = mysql_execute_query(con, command, opformat=MYSQL_ARRAY)

我们可以使用以下命令获取 SELECT 查询结果作为 Julia 数组,每行作为一个元组 −

command = """SELECT * FROM Employee;"""
retarr = mysql_execute_query(con, command, opformat=MYSQL_TUPLES)

我们可以执行多重查询,如下所示 −

command = """INSERT INTO Employee (Name) VALUES ('');
UPDATE Employee SET LunchTime = '15:00:00' WHERE LENGTH(Name) > 5;"""
data = mysql_execute_query(con, command)

我们可以使用准备好的语句来获取数据帧,如下所示 −

command = """SELECT * FROM Employee;"""

stmt = mysql_stmt_init(con)

if (stmt == C_NULL)
   error("Error in initialization of statement.")
end

response = mysql_stmt_prepare(stmt, command)
mysql_display_error(con, response != 0,
                  "Error occured while preparing statement for query \"$command\"")
                  
dframe = mysql_stmt_result_to_dataframe(stmt)
mysql_stmt_close(stmt)

使用以下命令关闭连接 −

mysql_disconnect(con)

JDBC

JDBC.jl 是 Java 数据库驱动程序的 Julia 接口。 JDBC.jl 包使我们能够使用 Java JDBC 驱动程序从 Julia 编程语言中访问数据库。

要开始使用它,我们需要首先将数据库驱动程序 jar 文件添加到类路径中,然后按如下方式初始化 JVM −

using JDBC
JavaCall.addClassPath("path of .jar file") # add the path of your .jar file
JDBC.init()

示例

Julia 中的 JDBC API 类似于 Java JDBC 驱动程序。 要连接数据库,我们需要遵循类似的步骤,如下所示 −

conn = DriverManager.getConnection("jdbc:gl:test/juliatest")
stmt = createStatement(conn)
rs = executeQuery(stmt, "select * from mytable")
   for r in rs
      println(getInt(r, 1), getString(r,"NAME"))
end

如果您希望将每一行作为 Julia 元组获取,请使用 JDBCRowIterator 迭代结果集。 请注意,如果这些值在数据库中被声明为可以为空,那么它们在元组中也可以为空。

for r in JDBCRowIterator(rs)
   println(r)
end

更新表格

使用PrepareStatement进行插入和更新。 它为不同类型定义了与 getter 函数相对应的 setter 函数 −

ppstmt = prepareStatement(conn, "insert into mytable values (?, ?)")
setInt(ppstmt, 1,10)
setString(ppstmt, 2,"TEN")
executeUpdate(ppstmt)

运行存储过程

使用CallableStatement运行存储过程 −

cstmt = JDBC.prepareCall(conn, "CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(?, ?)")
setString(cstmt, 1, "gl.locks.deadlockTimeout")
setString(cstmt, 2, "10")
execute(cstmt)

元数据

为了获取(column_name,column_type)元组数组,我们需要将 JResultSet 对象从executeQuery 传递到 getTableMetaData,如下所示 −

conn = DriverManager.getConnection("jdbc:gl:test/juliatest")
stmt = createStatement(conn)
rs = executeQuery(stmt, "select * from mytable")
metadata = getTableMetaData(rs)

使用以下命令关闭连接 −

close(conn)

执行查询

为了执行查询,我们首先需要一个游标。 获得游标后,您可以在游标上运行 execute! 命令,如下所示 −

csr = cursor(conn)
execute!(csr, "insert into ptable (pvalue) values (3.14);")
execute!(csr, "select * from gltable;")

迭代行

我们需要调用游标上的行来迭代行 −

rs = rows(csr)
for row in rs

end

使用以下命令关闭游标调用 −

close(csr)

ODBC

ODBC.jl 是一个为我们提供 Julia ODBC API 接口的包。 它由各种 ODBC 驱动程序管理器实现。 我们可以如下安装 −

julia> Pkg.add(“ODBC”)

安装 ODBC 驱动程序

使用以下命令安装 ODBC 驱动程序 −

ODBC.adddriver("name of driver", "full, absolute path to driver shared library"; kw...)

我们需要通过 −

  • 驱动程序姓名

  • 驱动程序共享库的完整绝对路径

  • 以及任何其他关键字参数,它们将作为 KEY=VALUE 对包含在 .ini 配置文件中。

启用连接

安装驱动程序后,我们可以执行以下操作来启用连接 −

  • 通过 ODBC.adddsn("dsn name", "driver name"; kw...) 设置 DSN

  • 使用完整连接字符串(如 ODBC.Connection(connection_string))直接连接

执行查询

以下是执行查询的两个路径 −

  • DBInterface.execute(conn, sql, params) − 它将直接执行 SQL 查询,然后返回任何结果集的 Cursor。

  • stmt = DBInterface.prepare(conn, sql); DBInterface.execute(stmt, params) − 它首先会准备一条SQL语句,然后执行。 也许可以使用不同的参数多次执行。

SQLite

SQLlite 是 Julia 编程语言的快速、灵活的分隔文件读取器和编写器。 该软件包已在 METADATA.jl 中注册,因此可以使用以下命令安装−

julia> Pkg.add("SQLite")

我们将结合示例讨论 SQLite 中使用的两个重要且有用的函数 −

SQLite.DB(file::AbstractString) − 此函数需要文件字符串参数作为要打开的预定义 SQLite 数据库的名称。 如果文件不存在,它将创建一个数据库。

示例

julia> using SQLite

julia> db = SQLite.DB("Chinook_Sqlite.sqlite")

这里我们使用可用于 SQLite、SQL Server、MySQL 等的示例数据库"Chinook"。

SQLite.query(db::SQLite.DB, sql::String, values=[]) − 在 db 上下文中执行准备好的 sql 语句后,此函数返回结果(如果有)。

示例

julia> SQLite.query(db, "SELECT * FROM Genre WHERE regexp('e[trs]', Name)")
6x2 ResultSet
| Row | "GenreId" |     "Name"           |
|-----|-----------|----------------------|
|   1 |     3     |     "Metal"          |
|   2 |     4     | "Alternative & Punk" |
|   3 |     6     |     "Blues"          |
|   4 |     13    |  "Heavy Metal"       |
|   5 |     23    |  "Alternative"       |
|   6 |     25    |     "Opera"          |

PostgreSQL

PostgreSQL.jl 是 PostgreSQL DBI 驱动程序。 它是 Julia 编程语言到 PostgreSQL 的接口。 它遵循 DBI.jl 工作协议并使用 C PostgreeSQL API (libpq)。

让我们通过以下代码来了解它的用法 −

using DBI
using PostgreSQL

conn = connect(Postgres, "localhost", "username", "password", "dbname", 5432)

stmt = prepare(conn, "SELECT 1::bigint, 2.0::double precision, 'foo'::character varying, " *
                     "'foo'::character(10);")
result = execute(stmt)
for row in result

end

finish(stmt)

disconnect(conn)

要使用 PostgreSQL,我们需要满足以下二进制要求 −

  • DBI.jl

  • DataFrames.jl >= v0.5.7

  • DataArrays.jl >= v0.1.2

  • libpq 共享库(附带标准 PostgreSQL 客户端安装)

  • 朱莉娅 0.3 或更高

Hive

Hive.jl是分布式SQL引擎的客户端。 它提供了HiveServer2,例如:Hive、Spark、SQL、Impala。

连接

要连接到服务器,我们需要创建一个 HiveSession 实例,如下所示 −

session = HiveSession()

也可以通过指定主机名和端口号来连接,如下 −

session = HiveSession(“localhost”,10000)

上面的默认实现将使用与 shell 相同的用户 ID 进行身份验证。 我们可以按如下方式覆盖它 −

session = HiveSession("localhost", 10000, HiveAuthSASLPlain("uid", "pwd", "zid"))

执行查询

我们可以执行 DML、DDL、SET 等语句,如下例所示 −

crs = execute(session, "select * from mytable where formid < 1001";
            async=true, config=Dict())
while !isready(crs)
   println("waiting...")
   sleep(10)
end
crs = result(crs)

其他软件包

DBAPI 是一个新的数据库接口提案,受到 Python 的 DB API 2.0 的启发,它违背了 Julia 中数据库驱动程序的抽象接口。 该模块包含以下内容 −

  • 抽象类型

  • 默认情况下抛出 NotImplementedError 的抽象必需函数

  • 默认情况下抛出NotSupportedError的抽象可选函数

要使用此 API,数据库驱动程序必须导入此模块、对其类型进行子类型化并为其函数创建方法。

DBPrf 是一个由 JuliaDB 维护的 Julia 数据库。 您可以在下面看到它的用法−

用户可以通过两种方式提供输入 −

命令行模式

$ julia DBPerf.jl <Database_Driver_1.jl> <Database_Driver_2.jl> ....... <Database_Driver_N.jl> <DBMS>

这里,Database_Driver.jl可以是以下类型 −

  • ODBC.jl

  • JDBC.jl

  • PostgreSQL.jl

  • MySQL.jl

  • Mongo.jl

  • SQLite.jl

DBMS 归档仅在我们使用 JDBC.jl 时才适用。

数据库可以是 Oracle 或 MySQL。

示例

DBPerf.jl ODBC.jl JDBC.jl MySql

从 Julia 提示符执行

julia> include("DBPerf.jl")
julia> DBPerf(<Database_Driver_1.jl>, <Database_Driver_2.jl>, ....... <Database_Driver_N.jl>, <DBMS>)

示例

DBPerf(“ODBC.jl”, “JDBC.jl”, “MySql”)