Creates a dynamic reference to a column that is not know at compile time.
Kysely is built in a way that by default you can't refer to tables or columns
that are not actually visible in the current query and context. This is all
done by typescript at compile time, which means that you need to know the
columns and tables at compile time. This is not always the case of course.
This method is meant to be used in those cases where the column names
come from the user input or are not otherwise known at compile time.
WARNING! Unlike values, column names are not escaped by the database engine
or Kysely and if you pass in unchecked column names using this method, you
create an SQL injection vulnerability. Always always validate the user
input before passing it to this method.
There are couple of examples below for some use cases, but you can pass
ref to other methods as well. If the types allow you to pass a ref
value to some place, it should work.
returnawaitdb .selectFrom('person') .select('person.first_name as fn') .orderBy(ref(orderBy)) .execute() }
someQuery('fn')
In this example we add selections dynamically:
const { ref } = db.dynamic
// Some column name provided by the user. Value not known at compile time. constcolumnFromUserInput = req.query.select;
// A type that lists all possible values `columnFromUserInput` can have. // You can use `keyof Person` if any column of an interface is allowed. typePossibleColumns = 'last_name' | 'first_name' | 'birth_date'
// The resulting type contains all `PossibleColumns` as optional fields // because we cannot know which field was actually selected before // running the code. constlastName: string | undefined = person.last_name constfirstName: string | undefined = person.first_name constbirthDate: string | undefined = person.birth_date
// The result type also contains the compile time selection `id`. person.id
Creates a dynamic reference to a column that is not know at compile time.
Kysely is built in a way that by default you can't refer to tables or columns that are not actually visible in the current query and context. This is all done by typescript at compile time, which means that you need to know the columns and tables at compile time. This is not always the case of course.
This method is meant to be used in those cases where the column names come from the user input or are not otherwise known at compile time.
WARNING! Unlike values, column names are not escaped by the database engine or Kysely and if you pass in unchecked column names using this method, you create an SQL injection vulnerability. Always always validate the user input before passing it to this method.
There are couple of examples below for some use cases, but you can pass
ref
to other methods as well. If the types allow you to pass aref
value to some place, it should work.Examples
Filter by a column not know at compile time:
Order by a column not know at compile time:
In this example we add selections dynamically: