1

是否有可能在 Linux 上使用 Swift(原始或 Swift 框架)连接到 Oracle 数据库?我所做的是尝试构建一个 Docker VM,安装 Oracle 二进制文件,添加 OCILIB 包,然后使用一个名为 SwiftOracle 的包连接 [已尝试],这似乎不受支持(很多构建问题)并且只是将 OCILIB C 代码暴露给Swift 使用模块映射和包装器。

我使用 Kitura 框架进行了尝试,但似乎都不起作用 - Xcode 无法编译,因为它既无法找到 C 库也无法创建模块。

以下是我尝试无济于事的步骤:

构建 Docker VM(包括 Oracle 二进制文件):https ://github.com/wnameless/docker-oracle-xe-11g

下载并安装 OCILIB:https ://github.com/vrogier/ocilib

添加 SwiftOracle 包,修复构建问题并尝试构建。

4

1 回答 1

2

您可以使用以下方法连接到oracle数据库:(这在vapor社区的帮助下成为可能。)

-----为了使oracle驱动工作,我在Ubuntu中绑定了这个方法---------------需要安装oracle客户端,以便可以定义头文件和库路径,您可以从 oracle 网站获得这些信息。

oracle-instantclinet*-basic-*.rpm
oracle-instantclinet*-devel-*.rpm
oracle-instantclinet*-sqlplus-*.rpm

--install 使用以下命令下载包

sudo alien -i oracle-instantclinet*-basic-*.rpm
sudo alien -i oracle-instantclinet*-devel-*.rpm
sudo alien -i oracle-instantclinet*-sqlplus-*.rpm

-- 在 ubuntu 中安装 libaio1

sudo apt install libaio1

-- 这个路径应该在 ~/.bashrc

#oracle home and library path
export ORACLE_HOME=/usr/lib/oracle/12.2/client64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle/12.2/client64/lib:/usr/local/lib

-- 从 Github 下载 OCILIB 库 git clone https://github.com/vrogier/ocilib.git(或下载最新版本/在 ocilib 4.5.2 上测试) -- 解压 ocilib 文件 cd 到 ocilib 文件夹,配置 make 和 make安装

    tar -zxf ocilib-4.5.2-gnu.tar.gz
    cd ocilib-4.5.2
    ./configure --with-oracle-headers-path=/usr/include/oracle/12.2/client64/ --with-oracle-lib-path=/usr/lib/oracle/12.2/client64/lib CFLAGS="-O2 -m64"
    make
    sudo make install

-- 如果需要处理unicodes就使用这个配置,一般不需要这个

./configure --with-oracle-headers-path=/usr/include/oracle/12.2/client64/ --with-oracle-lib-path=/usr/lib/oracle/12.2/client64/lib --with-oracle-charset=wide CFLAGS="-O2 -m64"

-- 上面的方法在你的机器上安装了OCILIB。-- 在您的 Vapor 项目中使用 OCILIB 库 在您的 Package.swift 文件中包含以下内容

    // swift-tools-version:4.0
    import PackageDescription

    let package = Package(
        name: "myAPIProject",
        dependencies: [
            //  A server-side Swift web framework.
            .package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"),

            //  Swift ORM (queries, models, relations, etc) built on SQLite 3.
            .package(url: "https://github.com/vapor/fluent-sqlite.git", from: "3.0.0"),

            //Oracle wrapper for swift
            .package(url: "https://github.com/h1257977/SwiftOracle.git", from: "0.1.7")
        ],
        targets: [
            .target(name: "App", dependencies: ["FluentSQLite","SwiftOracle", "Vapor"]),
            .target(name: "Run", dependencies: ["App"]),
            .testTarget(name: "AppTests", dependencies: ["App"])
        ]
    )

-- 在 Routes.swift 中,包括以下内容:

    import Vapor
    import SwiftOracle

    let service = OracleService(host: "192.168.1.12", port:"1521", service: "orcl")
    let b = Connection(service: service, user:"test", pwd:"oracle")

    final class VReq: Content {
        var name: String? 
        var age: String?

        init (NAME: String, AGE: String) {
        self.name = NAME
        self.age = AGE
    }

    final class VMdata {

            func getData() throws ->  [VReq] {
                try! b.open()
                b.autocommit = true
                let cursor = try! b.cursor()
                try! cursor.execute("select * from userlist")
                //iterates each row in the cursor and maps only the values (keys are unique) from the dictionary of each rows, if its nil it will replace with "null" 
                var items = cursor.map { row in row.dict.mapValues { "\($0 ?? "NULL")" }} //  output as [[String:String]]

                //takes each dictionary in the items array and returns a VReq
                let result = items.map { dict in VReq(NAME: dict["NAME"] ?? "NULL", ADDRESS: dict["ADDRESS"] ?? "NULL", USER_AGE: dict["USER_AGE"] ?? "NULL")}
                return result
                }

    }

    public func routes(_ router: Router) throws {

    router.get("test") { req -> [VReq] in

        let val = VMdata()
        let vdata = try! val.getData()
        return vdata

    }
    }

--要运行 Vapor 3,您需要链接库文件

swift build -Xlinker -L/usr/local/lib && ./.build/x86_64-unknown-linux/debug/Run --hostname 0.0.0.0

-- 要显示来自任何数据库列的 unicode 字符,您可能必须在托管 Vapor 应用程序的服务器中设置 NLS_LANG。

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
于 2018-11-30T05:03:13.963 回答