Можете ли вы проверить, существует ли таблица через 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);