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