
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
better-sqlite3-proxy
Advanced tools
Efficiently proxy sqlite tables and access data as typical array of objects.
Efficiently proxy sqlite tables and access data as typical array of objects. Powered by better-sqlite3🔋
true/false to 1/0Date instance to GMT timestampnull / not null columns| Array Operation | Mapped SQL Operation |
|---|---|
array.push(...object) | insert |
array[id] = object | insert or update |
update(array, id, partial) | update |
find(array, filter) | select where filter limit 1 |
filter(array, filter) | select where filter |
pick(array, columns, filter?) | select columns where filter |
count(array, filter) | select count where filter |
delete array[id] | delete where id |
del(array, filter) | delete where filter |
array.length = length | delete where id > length |
array.slice(start, end) | select where id >= start and id < end |
for-of loop, array.forEach(fn), array.filter(fn) and array.map(fn) are also supported, they will receive proxy-ed rows.
Tips: You can use for-of loop instead of array.forEach(fn) if you may terminate the loop early
Tips: You can use filter(partial) instead of array.filter(fn) for better performance
Tips: You can use pick(array, columns, filter?) instead of array.map(fn) for better performance
Tips: You can use update(array, id, partial) instead of Object.assign(row, partial) to update multiple columns in batch
Pro Tips: If you need complex query that can be expressed in sql, use prepared statement will have fastest runtime performance.
The results from mapped operations are proxy-ed object identified by id. Getting the properties on the object will trigger select on corresponding column, and setting the properties will trigger update on corresponding column.
Remark: @beenotung/better-sqlite3-helper is a fork of better-sqlite3-helper. It updates the dependency on better-sqlite3 to v8+ which includes arm64 prebuilds for macOS.
More Examples in schema-proxy.spec.ts
import DB from '@beenotung/better-sqlite3-helper'
import { proxySchema, unProxy, find, filter } from 'better-sqlite3-proxy'
let db = DB({
path: 'dev.sqlite3',
migrate: {
migrations: [
/* sql */ `
-- Up
create table if not exists user (
id integer primary key
, username text not null unique
);
-- Down
drop table user;
`,
/* sql */ `
-- Up
create table if not exists post (
id integer primary key
, user_id integer not null references user (id)
, content text not null
, created_at timestamp not null default current_timestamp
);
-- Down
drop table post;
`,
],
},
})
type DBProxy = {
user: User[]
post: Post[]
}
type User = {
id?: number
username: string
}
type Post = {
id?: number
user_id: number
content: string
created_at?: string
author?: User
}
let proxy = proxySchema<DBProxy>(db, {
user: ['id', 'username'], // specify columns explicitly or leave it empty to auto-scan from create-table schema
post: [
['author', { field: 'user_id', table: 'user' }], // link up reference fields
],
})
// insert record
proxy.user[1] = { username: 'alice' }
proxy.user.push({ username: 'Bob' })
proxy.post.push({ user_id: 1, content: 'Hello World' })
// select a specific column
console.log(proxy.user[1].username) // 'alice'
// select a specific column from reference table
console.log(proxy.post[1].author?.username) // 'alice'
// select all columns of a record
console.log(unProxy(proxy.post[1])) // { id: 1, user_id: 1, content: 'Hello World', created_at: '2022-04-21 23:30:00'}
// update a specific column
proxy.user[1].username = 'Alice'
// update multiple columns
proxy.post[1] = {
content: 'Hello SQLite',
created_at: '2022-04-22 08:30:00',
} as Partial<Post> as Post
// find by columns
console.log(find(proxy.user, { username: 'Alice' })?.id) // 1
// filter by columns
console.log(filter(proxy.post, { user_id: 1 })[0].content) // 'Hello SQLite
// delete record
delete proxy.user[2]
console.log(proxy.user.length) // 1
// truncate table
proxy.post.length = 0
console.log(proxy.post.length) // 0
More Examples in key-value.spec.ts
import DB from '@beenotung/better-sqlite3-helper'
import { proxyKeyValue, find, filter } from 'better-sqlite3-proxy'
export let db = DB({
path: 'dev.sqlite3',
migrate: false,
})
type DBProxy = {
users: {
id: number
username: string
}[]
}
let proxy = proxyKeyValue<DBProxy>(db)
// auto create users table, then insert record
proxy.users[1] = { id: 1, username: 'alice' }
proxy.users.push({ id: 2, username: 'Bob' })
// select from users table
console.log(proxy.users[1]) // { id: 1, username: 'alice' }
// update users table
proxy.users[1] = { id: 1, username: 'Alice' }
console.log(proxy.users[1]) // { id:1, username: 'Alice' }
// find by columns
console.log(find(proxy.users, { username: 'Alice' })?.id) // 1
// filter by columns
console.log(filter(proxy.users, { username: 'Bob' })[0].id) // 2
// delete record
delete proxy.users[2]
console.log(proxy.users.length) // 1
// truncate table
proxy.users.length = 0
console.log(proxy.users.length) // 0
More Examples in helpers.spec.ts
import DB from '@beenotung/better-sqlite3-helper'
import {
proxySchema,
toSqliteTimestamp,
fromSqliteTimestamp,
getTimes,
seedRow,
getId,
} from 'better-sqlite3-proxy'
import { proxy } from './proxy'
// Timestamp helpers
let timestamp = toSqliteTimestamp(new Date())
console.log(timestamp) // '2024-01-15 10:30:00'
let date = fromSqliteTimestamp(timestamp)
console.log(date) // Date object
// Select timestamps and convert to Date objects (from ISO string in GMT timezone)
let article = proxy.article[1]
let times = getTimes(article, ['created_at', 'updated_at'])
console.log(times.created_at) // Date object
// Update existing row or insert new row
let region_id = seedRow(proxy.region, { code: 'HK' }, { name: 'Hong Kong' })
console.log(region_id) // 1
// Simplified version of seedRow when the table only has one unique key
let tag_id = getId(proxy.hashtag, 'tag', 'linux')
console.log(tag_id) // 1
This project is licensed with BSD-2-Clause
This is free, libre, and open-source software. It comes down to four essential freedoms [ref]:
FAQs
Efficiently proxy sqlite tables and access data as typical array of objects.
The npm package better-sqlite3-proxy receives a total of 43 weekly downloads. As such, better-sqlite3-proxy popularity was classified as not popular.
We found that better-sqlite3-proxy demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.