在 JavaScript 中通过钱包连接到 oracle 云数据库?

Connect to oracle cloud database by wallet in JavaScript?

我有需要 运行 的脚本,准确地说是 CREATE TABLE 脚本。 我有这样的功能,见下:

oracleLoader.ts

const oracledb = require('oracledb');
import dbConfig from "./oracleDBConfig";
import log from "../utils/winston";

function oracleLoader(sql: string) {

  const connection = oracledb.getConnection(dbConfig);

  try{
    connection.execute(sql);
    log.info("Table created.");
  } catch (e) {
    log.error("SQL script do not executed!" + e);
  }

}

export default oracleLoader;

oracleDBConfig.ts

function oracleDBConfig() {
  return {
    user: mail,
    password: pass,
    connectString: str
  };
}

export default oracleDBConfig;

从哪里获得该用户名或者我需要电子邮件吗?

从哪里获取密码,是数据库密码还是oracle账户密码?

从哪里获取连接字符串?

如果我有带有 oracle-wallet 的 .zip 文件怎么办。

记住我需要连接到云端的数据库。

注意:在行 const connection = oracledb.getConnection(dbConfig); 中我有一个警告:

Argument type () => {password: string, user: string, connectString: string} is not assignable to parameter type GetConnectionOptions

您需要的用户名和密码是数据库用户名和密码。假设您使用的是 Oracle Autonomous DB,那么管理用户名是 'ADMIN'(您可以使用它来创建其他用户)。连接字符串将是您用钱包下载到 zip 文件中的 tnsnames.ora 文件中的别名。

因为这对您来说似乎很陌生,Oracle 的 'quick start' 是一个方便的起点 https://www.oracle.com/database/technologies/appdev/quickstartnodejs.html

'not assignable' 错误是另一个问题,与 Oracle 无关。首先,您需要调用 dbConfig() 来获取凭据。然后您需要以某种方式使用异步 oracledb 函数。然后你应该添加一些错误处理。

我不是 typescript 用户,但是这个运行:

const oracledb = require('oracledb');
import dbConfig from "./oracleDBConfig";

async function oracleLoader(sql: string) {

    let connection;
    try {
        connection = await oracledb.getConnection(dbConfig());
        const r = await connection.execute(sql);
        console.log(r);
        console.log("SQL statement was executed!");
    } catch (e) {
        console.error("SQL statement was not executed!" + e);
    } finally {
        if (connection) {
            try {
                await connection.close();
            } catch (err) {
                console.error(err);
            }
        }
    }
}

export default oracleLoader;

请注意 execute() 执行单个语句,而不是脚本。

在现实生活中,您可能想要使用连接池,请参阅 node-oracledb connection pooling 文档。