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”)
