2.4 KiB
Executable File
Raw
Sometimes you may need to use a raw expression in a query. Raw query object may be injected pretty much anywhere you want, and using proper bindings can ensure your values are escaped properly, preventing SQL-injection attacks.
Raw Parameter Binding
One can parameterize SQL given to strapi.connections.default.raw(sql, bindings)
. Parameters can be positional named. One can also choose if parameter should be treated as value or as SQL identifier e.g. in case of TableName.ColumnName
reference.
strapi.connections.default('users')
.select(strapi.connections.default.raw('count(*) as user_count, status'))
.where(strapi.connections.default.raw(1))
.orWhere(strapi.connections.default.raw('status <> ?', [1]))
.groupBy('status')
Positional bindings ?
is interpret as value and ??
as identifier:
strapi.connections.default('users')
.where(strapi.connections.default.raw('?? = ?', ['user.name', 1]))
Named bindings :name
is interpret as value and :name:
as identifier:
strapi.connections.default('users')
.where(strapi.connections.default.raw(':name: = :thisGuy or :name: = :otherGuy', {
name: 'users.name',
thisGuy: 'Bob',
otherGuy: 'Jay'
}))
For simpler queries where one only has a single binding, .raw
can accept said binding as its second parameter :
strapi.connections.default('users')
.where(
strapi.connections.default.raw('LOWER("login") = ?', 'strapi')
)
.orWhere(
strapi.connections.default.raw('accesslevel = ?', 1)
)
.orWhere(
strapi.connections.default.raw('updtime = ?', new Date())
)
Note that due to ambiguity, arrays must be passed as arguments within a containing array :
strapi.connections.default
.raw('select * from users where id in (?)', [[1, 2, 3]])
To prevent replacement of ?
one can use escape sequence \\?
.
strapi.connections.default
.select('*').from('users')
.where('id', '=', 1)
.whereRaw('?? \\? ?', ['jsonColumn', 'jsonKey'])
Raw expressions
Raw expressions are created by using strapi.connections.default.raw(sql, [bindings])
and passing this as a value for any value in the query chain.
strapi.connections.default('users')
.select(strapi.connections.default.raw('count(*) as user_count, status'))
.where(strapi.connections.default.raw(1))
.orWhere(strapi.connections.default.raw('status <> ?', [1]))
.groupBy('status')