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 的主版本 -

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 查询结果作为数据帧 -

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

我们可以使用以下命令获取 SELECT 查询结果作为 Julia 数组 -

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.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, value=[]) - 在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.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

  • 蒙戈.jl

  • SQLite.jl

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

数据库可以是 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”)