Состояние гонки в SQLite в NodeJS - PullRequest
0 голосов
/ 07 ноября 2018

Я новичок в NodeJS и базах данных. И я запутался с поведением моей программы. Я просто пытаюсь создать таблицу, а затем удалить ее. Но что-то не так в моем коде. Результаты действительно странные. Я запускал свой код несколько раз, и результаты разные. Пример результатов:

First execution
[ { name: 'first' } ]
createTable error SQLITE_ERROR: table first already exists
[ { name: 'first' } ]
table first dropped

Second execution
[]
[]
table first(name text) created succesfully

Third execution
createTable error SQLITE_ERROR: table first already exists
[ { name: 'first' } ]
[ { name: 'first' } ]
table first dropped

Код указан ниже. Если бы кто-то мог указать на мою ошибку, я был бы признателен.

import { Database } from 'sqlite3';

class DBWrapper {
    private db: Database;
    constructor(dbName: string) {
        this.db = new Database(dbName, (error) => {
            if (error) {
                console.log('Database construction failed');
            } else {
                console.log('Database created successfully');
            }
        });
    }

    public createTable(tableName: string): void {
        this.db.serialize(() => {
            this.db.run('CREATE TABLE ' + tableName, (error) => {
                if (error) {
                    console.log('createTable error ' + error.message);
                } else {
                    console.log('table ' + tableName + ' created succesfully');
                }
            });
        });
        this.db.close();
        this.db = new Database('sqlitest');
    }

    public printTables(): void {
        this.db.serialize(() => {
            this.db.all('select name from sqlite_master where type=\'table\'', (error, tables) => {
                console.log(tables);
            });
        });
        this.db.close();
        this.db = new Database('sqlitest');
    }

    public clear(): void {
        this.db.serialize(() => {
            this.db.all('select name from sqlite_master where type=\'table\'', (error, tables) => {
                if (error) {
                    console.log('error in select all tables');
                } else {
                    tables.forEach((table) => {
                        this.db.run('DROP TABLE ' + table.name, (innerError) => {
                            if (innerError) {
                                console.log('drop table ' + table.name + ' error ' + innerError.message);
                            } else {
                                console.log('table ' + table.name + ' dropped');
                            }
                        });
                    });
                }
            });
        });
        this.db.close();
        this.db = new Database('sqlitest');
    }
}

const testDB = new DBWrapper('sqlitest');
testDB.createTable('first(name text)');
testDB.printTables();
testDB.clear();
testDB.printTables();

1 Ответ

0 голосов
/ 07 ноября 2018

Вам нужно дождаться завершения каждой команды, прежде чем начинать следующую команду.

Обычно db.serialize() сделает это за вас, но вы создаете новый экземпляр db после каждой команды, который не знает об ожидающей операции из предыдущего экземпляра.

Вы должны повторно использовать экземпляр db.

...