← Cloudflare D1 / d1 / worker-api
Методы prepared statement
В этой главе описаны различные способы выполнения запроса и получения его результатов после того, как вы подготовили ваш оператор.
Методы
bind()
Привязывает параметр к prepared statement.
const someVariable = `Bs Beverages`;
const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(someVariable);some_variable = "Bs Beverages"
stmt = self.env.DB.prepare(
"SELECT * FROM Customers WHERE CompanyName = ?"
).bind(some_variable)Параметр
Variable:string- Переменная, которая добавляется в prepared statement. См. рекомендации ниже.
Возвращаемые значения
D1PreparedStatement:Object- A
D1PreparedStatementгде входной параметр был включён в инструкцию.
- A
Рекомендации
-
D1 следует соглашение SQLite ↗ для привязки параметров prepared statements. В настоящее время D1 поддерживает только упорядоченную привязку (
?NNNN) и Anonymous (?) параметров. В будущем D1 будет поддерживать также именованные параметры.Синтаксис Тип Описание ?NNNУпорядоченная Знак вопроса, за которым следует число NNNрезервирует место дляNNN-й параметр.NNNдолжен находиться в диапазоне от1иSQLITE_MAX_VARIABLE_NUMBER?Анонимный Знак вопроса, за которым не следует число, создаёт параметр с номером на единицу больше наибольшего уже назначенного номера параметра. Если из-за этого номер параметра превысит SQLITE_MAX_VARIABLE_NUMBER, это ошибка. Такой формат параметров предоставлен для совместимости с другими СУБД. Но поскольку в вопросительных знаках легко ошибиться при подсчёте, использовать этот формат параметров не рекомендуется. Разработчикам рекомендуется использовать один из символьных форматов ниже или?NNNформат выше.Чтобы привязать параметр, используйте
.bindметод.Примеры упорядоченной и анонимной привязки:
const stmt = db.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind("");stmt = db.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind("")const stmt = db .prepare("SELECT * FROM Customers WHERE CompanyName = ? AND CustomerId = ?") .bind("Alfreds Futterkiste", 1);stmt = db.prepare( "SELECT * FROM Customers WHERE CompanyName = ? AND CustomerId = ?" ).bind("Alfreds Futterkiste", 1)const stmt = db .prepare( "SELECT * FROM Customers WHERE CompanyName = ?2 AND CustomerId = ?1" ).bind(1, "Alfreds Futterkiste");stmt = db.prepare("SELECT * FROM Customers WHERE CompanyName = ?2 AND CustomerId = ?1").bind(1, "Alfreds Futterkiste")
Статические операторы
D1 API поддерживает статические операторы. Статические операторы представляют собой SQL-операторы, в которых переменные заданы напрямую в коде. При написании статического оператора вы вручную указываете значение переменной внутри строки оператора.
Пример prepared statement с динамически привязанным значением:
const someVariable = `Bs Beverages`;
const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(someVariable);
// A variable (someVariable) will replace the placeholder '?' in the query.
// `stmt` is a prepared statement.some_variable = "Bs Beverages"
stmt = self.env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(some_variable)
# A variable (some_variable) will replace the placeholder '?' in the query.
# `stmt` is a prepared statement.Пример статического оператора:
const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = 'Bs Beverages'");
// "Bs Beverages" is hard-coded into the query.
// `stmt` is a static statement.stmt = self.env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = 'Bs Beverages'")
# "Bs Beverages" is hard-coded into the query.
# `stmt` is a static statement.run()
Выполняет подготовленный запрос (или запросы) и возвращает результаты. Возвращаемые результаты включают метаданные.
const returnValue = await stmt.run();return_value = await stmt.run()Параметр
- Нет.
Возвращаемые значения
D1Result:Object- Объект, содержащий статус успешного выполнения, объект meta и массив объектов с результатами запроса.
- Дополнительную информацию об этом объекте см. в
D1Result.
Пример возвращаемых значений
const someVariable = `Bs Beverages`;
const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(someVariable);
const returnValue = await stmt.run();
return Response.json(returnValue);from workers import Response
some_variable = "Bs Beverages"
stmt = self.env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(some_variable)
return_value = await stmt.run()
return Response.json(return_value){
"success": true,
"meta": {
"served_by": "miniflare.db",
"duration": 1,
"changes": 0,
"last_row_id": 0,
"changed_db": false,
"size_after": 8192,
"rows_read": 4,
"rows_written": 0
},
"results": [
{
"CustomerId": 11,
"CompanyName": "Bs Beverages",
"ContactName": "Victoria Ashworth"
},
{
"CustomerId": 13,
"CompanyName": "Bs Beverages",
"ContactName": "Random Name"
}
]
}Рекомендации
resultsне содержит значения для операций записи, таких какUPDATE,DELETE, илиINSERT.- При использовании TypeScript можно передать параметр типа к
D1PreparedStatement::runчтобы вернуть типизированный объект результата. D1PreparedStatement::runпо функциональности соответствуетD1PreparedStatement::all, и это можно рассматривать как псевдоним.- Вы можете извлекать только ожидаемые результаты оператора, просто возвращая
resultsсвойство возвращаемого объекта.
Пример возврата только results
resultsreturn Response.json(returnValue.results);from workers import Response
return Response.json(return_value.results)[
{
"CustomerId": 11,
"CompanyName": "Bs Beverages",
"ContactName": "Victoria Ashworth"
},
{
"CustomerId": 13,
"CompanyName": "Bs Beverages",
"ContactName": "Random Name"
}
]raw()
Выполняет подготовленный запрос (или запросы) и возвращает результаты в виде массива массивов. Возвращаемые результаты не включают метаданные.
Имена столбцов по умолчанию не включаются в результирующий набор. Чтобы включить имена столбцов как первую строку массива результатов, установите .raw({columnNames: true}).
const returnValue = await stmt.raw();return_value = await stmt.raw()Параметры
columnNames:ObjectНеобязательно- Объект типа boolean, который включает имена столбцов в первой строке массива результатов.
Возвращаемые значения
Array:Array- Массив массивов. Каждый вложенный массив представляет собой строку.
Пример возвращаемых значений
const someVariable = `Bs Beverages`;
const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(someVariable);
const returnValue = await stmt.raw();
return Response.json(returnValue);from workers import Response
some_variable = "Bs Beverages"
stmt = self.env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(some_variable)
return_value = await stmt.raw()
return Response.json(return_value)[
[11, "Bs Beverages",
"Victoria Ashworth"
],
[13, "Bs Beverages",
"Random Name"
]
]С параметром columnNames: true:
const someVariable = `Bs Beverages`;
const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(someVariable);
const returnValue = await stmt.raw({columnNames:true});
return Response.json(returnValue)from workers import Response
some_variable = "Bs Beverages"
stmt = self.env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(some_variable)
return_value = await stmt.raw(columnNames=True)
return Response.json(return_value)[
[
"CustomerId",
"CompanyName",
"ContactName"
],
[11, "Bs Beverages",
"Victoria Ashworth"
],
[13, "Bs Beverages",
"Random Name"
]
]Рекомендации
- При использовании TypeScript можно передать параметр типа к
D1PreparedStatement::rawчтобы вернуть типизированный массив результатов.
first()
Выполняет подготовленный запрос (или запросы) и возвращает первую строку результата в виде объекта. Метаданные при этом не возвращаются: сразу возвращается сам объект.
const values = await stmt.first();values = await stmt.first()Параметры
columnName:StringНеобязательно- Укажите
columnNameчтобы вернуть значение указанного столбца из первой строки результата запроса.
- Укажите
- Нет.
- Чтобы получить все столбцы первой строки, не передавайте параметр.
Возвращаемые значения
-
firstRow:ObjectНеобязательно- Объект, содержащий первую строку результата запроса.
- Возвращаемое значение будет дополнительно отфильтровано до конкретного атрибута, если
columnNameбыло указано.
-
null:null- Если запрос не возвращает ни одной строки.
Пример возвращаемых значений
Получение всех столбцов из первой строки:
const someVariable = `Bs Beverages`;
const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(someVariable);
const returnValue = await stmt.first();
return Response.json(returnValue)from workers import Response
some_variable = "Bs Beverages"
stmt = self.env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(some_variable)
return_value = await stmt.first()
return Response.json(return_value){
"CustomerId": 11,
"CompanyName": "Bs Beverages",
"ContactName": "Victoria Ashworth"
}Получение конкретного столбца из первой строки:
const someVariable = `Bs Beverages`;
const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(someVariable);
const returnValue = await stmt.first("CustomerId");
return Response.json(returnValue)from workers import Response
some_variable = "Bs Beverages"
stmt = self.env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(some_variable)
return_value = await stmt.first("CustomerId")
return Response.json(return_value)11Рекомендации
- Если запрос возвращает строки, но
columnне существует, тоD1PreparedStatement::firstвыбрасываетD1_ERRORисключение. D1PreparedStatement::firstне изменяет SQL-запрос. Для повышения производительности рассмотрите возможность добавленияLIMIT 1к вашему запросу.- При использовании TypeScript можно передать параметр типа к
D1PreparedStatement::firstчтобы вернуть типизированный объект результата.