[DEPRECATED] This library is not actively maintained any more. Please use sqlex instead.
sqlit is a library to help retrieve, update, import and export data from a relational database easily. Apart from standard database relations like one-to-one, many-to-one and many-to-many, it also has built-in support for hierarchical data (trees) using closure tables, including cloning a tree rooted at a specific object.
$ npm install sqlit
The easiest way to use sqlit is to create an instance of Database by passing in your database connection details:
constDatabase=require('sqlit').Database;constdb=newDatabase({dialect: 'mysql',connection: {user: 'root',password: 'secret',database: 'example',timezone: 'Z',connectionLimit: 10}});After creating the database instance, you'll need to let sqlit retrieve the schema information about your database:
awaitdb.buildSchema();Now the database instance is ready for use. Let's play with some data.
Select the 2nd 10 products ordered by their names:
constdb=helper.connectToDatabase(NAME);constoptions={where: {name_like: '%Apple'},orderBy: 'name',offset: 10,limit: 10};db.table('product').select('*',options);This example selects all rows from the order table of your database along with the user details and items in that order:
constrows=awaitdb.table('order').select({user: '*',orderItems: {fields: {product: '*'}}});This example creates a new category and then renames its name:
db.table('category').insert({name: 'Ice'}).then(id=>{expect(id).toBeGreaterThan(0);db.table('category').update({name: 'Ice Cream'},{name: 'Ice'}).then(()=>{db.table('category').select('*',{where: { id }}).then(rows=>{expect(rows.length).toBe(1);expect(rows[0].name).toBe('Ice Cream');done();});});});This example does an upsert to the order table:
table.upsert({user: {connect: {email: 'alice@example.com'}},code: `test-order-${ID}`},{user: {create: {email: 'nobody@example.com'}},code: `test-order-${ID}2`});}This example creates a category and populates it with some products:
constdata={name: 'Vegetable',parent: {connect: {id: 1}},categories: {create: [{name: 'Cucumber'},{name: 'Tomato'}],connect: [{parent: {id: 2},name: 'Apple'},{parent: {id: 2},name: 'Banana'}]}};awaittable.create(data);This example creates a category tree:
const root = await table.create({
name: 'All',
parent: null
});
const fruit = await table.create({
name: 'Fruit',
parent: { connect: { id: root.id } }
});
const apple = await table.create({
name: 'Apple',
parent: { connect: { id: fruit.id } }
});
await table.create({
name: 'Fuji',
parent: { connect: { id: apple.id } }
});
await table.create({
name: 'Gala',
parent: { connect: { id: apple.id } }
});
You don't have to wait for an object to be persisted to the database before referencing it. Objects can even have cyclic references before they are persisted.
This example create a user and an order which reference each other (note the user.status = order line is for demo purposes only):
constuser=db.table('user').append();user.email='random';constorder=db.table('order').append({code: 'random'});order.user=user;user.status=order;db.flush().then(async()=>{constuser=awaitdb.table('user').get({email: 'random'});constorder=awaitdb.table('order').get({code: 'random'});expect(user.status).toBe(order.id);done();});This example populates the category table with a list of objects. Properties other than name, parent_name, and parent_parent are saved to a table called category_attribute table using a key/value fashion:
consttable=db.table('category');constconfig={category: {name: 'name',parent_name: 'parent.name',parent_parent: 'parent.parent','*': 'categoryAttributes[name, value]'}};constdata=[{categoryName: 'Example B1',parent_name: 'Example B1 Parent',parent_parent: null,colour: 'Red',weight: '100kg'}];awaittable.load(data,config.category);This example extracts data from a number of tables and returns a flat list of objects:
constconfig={name: 'name',parent_name: 'parent.name',product_name: 'products.name',product_price: 'products.price','*': 'categoryAttributes[name, value]'};constdocs=awaitdb.table('category').xselect(config);More examples can be found in the test folder.
sqlit comes with a command line tool that does a few useful things.
To dump the database schema into a json file:
node_modules/sqlit/bin/sqlit.js --dialect postgres -u user1 -p secret1 mydb
- Put a
debuggerstatement in the source code - Start node:
$ node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand
- Visit
chrome://inspect