您可以通过Cloud Spanner API检查表是否存在吗? (在Node.js中)

我怎么能检测表存在或不在表中的数据库中? 有没有像:

database.exist('some table name') 

我写我的function:

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

有没有其他的想法?

假设您正在使用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> ( ...语句的正则expression式:

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