flora-mysql
MySQL data source for Flora, based on the mysql module.
Usage
Add flora-mysql to Flora config
module.exports = {
…
dataSources: {
mysql: {
constructor: require('flora-mysql'),
options: {
onConnect: ['SET SESSION max_execution_time = 30000'],
servers: {
default: {
user: 'dbuser',
password: '…',
masters: [{ host: 'db01' }],
slaves: [{ host: 'db02' }, { host: 'db03' }],
}
specialServer: {
user: 'dbuser2',
password: '…',
masters: [{ host: 'specialdb01' }],
},
},
},
},
…
};
Use data source in resources
SELECT
queries may be executed on one of the slaves
servers (if present), unless useMaster
is set to true
.
const db = api.dataSources.mysql.getContext({
db: 'users',
});
const allRows = await db.query(
'SELECT firstname, lastname FROM profiles'
);
const someRows = await db.query(
'SELECT firstname, lastname FROM profiles WHERE id = ?',
[ 1000 ]
);
const someRows = await db.query(
'SELECT firstname, lastname FROM profiles WHERE id = :userId',
{ userId: 1000 }
);
const ids = await db.queryCol(
'SELECT id FROM profiles WHERE lastname = "Smith"'
);
const { firstname, lastname } = await db.queryRow(
'SELECT firstname, lastname FROM profiles WHERE id = 1000'
);
const firstname = await db.queryOne(
'SELECT firstname FROM profiles WHERE id = 1000'
);
Insert, update, delete
Write queries are executed on master
servers automatically, even when useMaster
was set to false
in getContext
.
db.insert('profiles', {
firstname: 'Max',
lastname: 'Mustermann',
updatedAt: db.raw('NOW()'),
});
db.upsert(
'profiles',
{ id: 1000, firstname: 'Max' },
[ 'firstname' ]
);
db.update(
'profiles',
{ updatedAt: db.raw('NOW()') },
{ id: 1000 }
);
db.delete('profiles', { id: 1000 });
Transactions
const trx = await db.transaction();
try {
await trx.update('profiles', …);
await trx.insert('log', …);
await trx.commit();
} catch (err) {
try {
await trx.rollback();
} catch (ignoreErr) { }
throw err;
}
await db.transaction(async (trx) => {
await trx.update('profiles', …);
await trx.insert('log', …);
});
Features
- When being used as data source for resource-processor, SQL queries are optimized and only the columns needed are selected.
License
MIT