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