Можете ли вы проверить, существует ли таблица через API Cloud Spanner? (в Node.js)

Как я могу определить, существует ли таблица в базе данных или нет по имени таблицы? там не нравится

database.exist('some table name')

Я пишу свою функцию:

const queryTableExist = (tableName) => {
    return {
        sql: `SELECT t.table_name FROM information_schema.tables AS t WHERE t.table_catalog = '' and t.table_schema = '' and  t.table_name='${tableName}'`
    };
};
let tableExist = (tableName, cb) => {
    const query = queryTableExist(tableName);
    database.run(query, (err, rows) => {
        if (err) {
            console.log(`${err}\n${query}`);
            cb(err);
        }

        cb(err, rows.length > 0);
    })
};

есть ли другая идея?

3 ответа

Предполагая, что вы используете клиентскую библиотеку google-cloud-node и пакет Cloud Spanner:

Вы можете либо вызвать call table.create() и обработать ошибку:

var schema =
  'CREATE TABLE Singers (' +
  '  SingerId INT64 NOT NULL,' +
  '  FirstName STRING(1024),' +
  '  LastName STRING(1024),' +
  '  SingerInfo BYTES(MAX),' +
  ') PRIMARY KEY(SingerId)';

table.create(schema, function(err, table, operation, apiResponse) {
  if (err) {
    // Error handling omitted.
  }

  operation
    .on('error', function(err) {})
    .on('complete', function() {
      // Table created successfully.
    });
});

Или вы можете попытаться получить ссылку на таблицу, а затем проверить наличие нулевого объекта:

var instance = spanner.instance('my-instance');
var database = instance.database('my-database');
var table = database.table('my-table');

Google Spanner API в настоящее время не поддерживает exists функция, чтобы узнать, какая таблица существует. Так что вам нужно сделать запрос самостоятельно в данный момент.

самый эффективный способ получить ваш ответ

Получить все существующие таблицы

SELECT
    t.table_name
FROM
    information_schema.tables AS t
WHERE
    t.table_catalog = '' AND t.table_schema = ''

Узнайте, существуют ли определенные таблицы

SELECT
    t.table_name
FROM
    information_schema.tables AS t
WHERE
    t.table_catalog = '' AND t.table_schema = '' AND
    t.table_name = 'yourTableNameA' OR
    t.table_name = 'yourTableNameB' OR
    t.table_name = 'yourTableNameC'

Я думаю, что лучший способ сделать это - запросить DDL из базы данных и проверить наличие CREATE TABLE <your-table-name-here> ( ... оператор с регулярным выражением:

var instance = spanner.instance('my-instance');
var database = instance.database('my-database');

function databaseHasTable(database, tableName) {
  return database.getSchema().then(function (data) {
    var statements = data[0];
    var matcher = new RegExp('^create table ' + tableName + ' \\(', 'i');
    var results = statements.filter(function (item) {
      return matcher.test(item);
    });
    return results.length == 1;
  });
}

// This should print out true or false depending on the table being there.
databaseHasTable(database, 'my-table').then(console.log);
Другие вопросы по тегам