Способ вставить объект в sqlite? - PullRequest
1 голос
/ 17 марта 2019

У меня следующий запрос:

'INSERT INTO guild (id, name, db_permissions, join_message, leave_message, verify_role) VALUES (?, ?, ?, ?, ?, ?)', guild

Где guild - это объект, я пытаюсь использовать значения объекта в качестве параметров для запроса, первые 3 параметра не могут быть нулевыми, но в моем коде дополнительные параметры возвращают undefined, что приведет к ошибке, которая говорит слишком мало параметров, я решил попробовать заменить undefined на null Object.values(parameters).map(x => x == undefined ? null : x)

однако это дало бы мне

[ '555340371060850708', 'Test', true, null, null, null ]

SQLite3 can only bind numbers, strings, Buffers, and null

Когда я присоединяюсь как Object.values(parameters).map(x => x == undefined ? null : x).join(', ')

Я получаю: 555340371060850708, Test, true, , ,

Что приводит к Too few parameters provided, что я могу сделать, чтобы правильно вставить объект Гильдии? моя структура базы данных:

CREATE TABLE "guild" (
    "id"    TEXT NOT NULL UNIQUE,
    "name"  TEXT NOT NULL,
    "db_permissions"    INTEGER NOT NULL,
    "join_message"  TEXT,
    "leave_message" TEXT,
    "verify_role"   TEXT,
    PRIMARY KEY("id")
);


Guild: 
export class Guild {
    private id: string
    private name: string
    private dbPermissions: number
    private joinMessage?: string
    private leaveMessage?: string
    private verifyRole?: string

    constructor(id: string, name: string, dbPermissions: number, joinMessage?: string, leaveMessage?:string, verifyRole?:string) {
        this.id = id
        this.name = name
        this.dbPermissions = dbPermissions
        this.joinMessage = joinMessage
        this.leaveMessage = leaveMessage
        this.verifyRole = verifyRole
    }
}

const guild = new Guild(message.guild.id, message.guild.name, 1)

1 Ответ

0 голосов
/ 17 марта 2019

Возможно, у вас возникла проблема с генерацией массива для параметров, после чего вы могли бы использовать метод получения этих значений в определенном порядке.

class Guild {

    constructor(id, name, dbPermissions, joinMessage, leaveMessage, verifyRole) {
        this.id = id;
        this.name = name;
        this.dbPermissions = dbPermissions;
        this.joinMessage = joinMessage;
        this.leaveMessage = leaveMessage;
        this.verifyRole = verifyRole;
    }

    get parameters() {
        const keys = ['id', 'name', 'dbPermissions', 'joinMessage', 'leaveMessage', 'verifyRole'];
        return keys.map(k => this[k]);
    }
}

var guild = new Guild('555340371060850708', 'Test', true),
    db = new SQL.Database(),
    stmt;

db.run('CREATE TABLE "guild" ("id" TEXT NOT NULL UNIQUE, "name" TEXT NOT NULL, "db_permissions" INTEGER NOT NULL, "join_message" TEXT, "leave_message" TEXT, "verify_role" TEXT, PRIMARY KEY("id"));');
db.run('INSERT INTO guild (id, name, db_permissions, join_message, leave_message, verify_role) VALUES (?, ?, ?, ?, ?, ?)', guild.parameters);

stmt = db.prepare("SELECT * FROM guild");
while (stmt.step()) {
    console.log(stmt.getAsObject());
}
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/0.5.0/js/sql.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...