您可以通过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);