Appearance
Using ORM
Directly using the sqlite3 interface requires providing SQL statements for database operations, which can be cumbersome. To simplify this, we can use Object-Relational Mapping (ORM), which maps database tables to JavaScript objects.
For instance, a users table can be represented as:
| id | name | password | |
|---|---|---|---|
| 1 | admin@example.com | Bob | 123456 |
| 2 | lucy@example.com | Lucy | abcdef |
| 3 | alice@example.com | Alice | hello123 |
Each row can be modeled as a JavaScript object. To facilitate this mapping, we can use an ORM framework like Sequelize.
Setting Up Sequelize
First, we need to install Sequelize and the SQLite driver:
bash
npm install sequelize sqlite3Then, define the ORM mapping in orm.mjs:
javascript
// orm.mjs:
import { Sequelize, DataTypes } from 'sequelize';
export const sequelize = new Sequelize('sqlite:test.db');
export const User = sequelize.define('User', {
id: {
primaryKey: true,
autoIncrement: true,
type: DataTypes.INTEGER,
allowNull: false
},
email: {
unique: true,
type: DataTypes.STRING,
allowNull: false
},
name: {
type: DataTypes.STRING,
allowNull: false
},
password: {
type: DataTypes.STRING,
allowNull: false
}
}, {
tableName: 'users'
});Integrating with the Application
Next, modify app.mjs to use Sequelize for database operations:
javascript
import { sequelize, User } from './orm.mjs';
async function initDb() {
await sequelize.sync();
const email = 'admin@example.com';
let user = await User.findOne({ where: { email } });
if (user === null) {
await User.create({
email,
name: 'Bob',
password: '123456'
});
}
}
await initDb();Updating Sign-In Logic
Update signin.mjs to utilize Sequelize for user authentication:
javascript
import { User } from '../orm.mjs';
async function signin(ctx, next) {
let email = ctx.request.body.email || '';
let password = ctx.request.body.password || '';
let user = await User.findOne({ where: { email } });
if (user && user.password === password) {
console.log('signin ok!');
ctx.render('signin-ok.html', { title: 'Sign In OK', name: user.name });
} else {
console.log('signin failed!');
ctx.render('signin-failed.html', { title: 'Sign In Failed' });
}
}Running the Application
When you run node app.mjs, you’ll see the SQL statements generated by Sequelize in the console. Note that Sequelize automatically adds createdAt and updatedAt fields to your model, so the users table will look like this:
sql
CREATE TABLE IF NOT EXISTS `users` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`email` VARCHAR(255) NOT NULL UNIQUE,
`name` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NOT NULL
);Common Operations
Sequelize provides various methods for database operations, such as:
findAll(): Returns multiple records.findOne(): Returns a single record.create(): Saves a new record.save(): Updates an existing record.destroy(): Deletes a record.
For more advanced features like associations, refer to the official Sequelize documentation.