2

如何通过表名检测数据库中是否存在表?没有像:

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);
    })
};

还有其他想法吗?

4

3 回答 3

1

假设您使用的是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');
于 2017-03-06T20:31:10.477 回答
1

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'
于 2017-03-22T21:29:12.443 回答
0

我认为最好的方法是从数据库中请求 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);
于 2017-03-15T15:36:00.737 回答