1

我有以下查询:

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

对象在哪里guild,我试图将对象值用作查询的参数,前 3 个参数不能为空,但在我的代码中,可选参数返回未定义,这会导致错误提示参数太少,我决定尝试用 null 替换 undefinedObject.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,我该怎么做才能正确插入 Guild 对象?我的数据库结构:

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)

4

1 回答 1

0

也许您在为参数生成数组时遇到问题,然后您可以按定义的顺序对这些值使用 getter。

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>

于 2019-03-17T10:47:33.490 回答