- Database
- # [«create_aggregate»] (name, aggregateFunctions) →
- # [«create_function»] (name, func) →
- # [«each»] (sql, params opt , callback, done) →
- # [«exec»] (sql, params opt ) → >
- Example use
- # [«handleError»] ()
- # [«iterateStatements»] (sql) →
- # [«prepare»] (sql, params opt ) →
- # [«run»] (sql, params opt ) →
- Type Definitions
- # QueryExecResult
- # SqlValue
- Выполнить sql запрос javascript
- Параметризация запросов
- HTML 5. Работа с Web SQL базой данных
- Соединение с базой данных.
- Выполнение запросов.
- Вставка данных.
- Работа с результатами запросов.
- Заключение.
Database
Close the database, and all associated prepared statements. The memory associated to the database and all associated statements will be freed.
Warning: A statement belonging to a database that has been closed cannot be used anymore.
Databases must be closed when you’re finished with them, or the memory consumption will grow forever
# [«create_aggregate»] (name, aggregateFunctions) →
Register a custom aggregate with SQLite
the name of the aggregate as referenced in SQL statements.
object containing at least a step function.
Properties
a function receiving no arguments and returning an initial value for the aggregate function. The initial value will be null if this key is omitted.
a function receiving the current state and a value to aggregate and returning a new state. Will receive the value from init for the first step.
a function returning the result of the aggregate function given its final state. If omitted, the value returned by the last step will be used as the final value.
The database object. Useful for method chaining
Register a custom sum function
db.create_aggregate("js_sum", < init: () =>0, step: (state, value) => state + value, finalize: state => state >); db.exec("SELECT js_sum(column1) FROM (VALUES (1), (2))"); // = 3
# [«create_function»] (name, func) →
Register a custom function with SQLite
the name of the function as referenced in SQL statements.
the actual function to be executed.
The database object. Useful for method chaining
Register a simple function
db.create_function("addOne", function (x) ) db.exec("SELECT addOne(1)") // = 2
# [«each»] (sql, params opt , callback, done) →
Execute an sql statement, and call a callback for each row of result.
Currently this method is synchronous, it will not return until the callback has been called on every row of the result. But this might change.
A string of SQL text. Can contain placeholders that will be bound to the parameters given as the second argument
Parameters to bind to the query
Function to call on each row of result
A function that will be called when all rows have been retrieved
The database object. Useful for method chaining
db.each("SELECT name,age FROM users WHERE age >= $majority", , function (row) );
# [«exec»] (sql, params opt ) → >
Execute an SQL query, and returns the result.
This is a wrapper against Database.prepare, Statement.bind, Statement.step, Statement.get, and Statement.free.
The result is an array of result elements. There are as many result elements as the number of statements in your sql string (statements are separated by a semicolon)
Example use
We will create the following table, named test and query it with a multi-line statement using params:
id | age | name |
---|---|---|
1 | 1 | Ling |
2 | 18 | Paul |
var db = new SQL.Database(); var res = db.exec( "DROP TABLE IF EXISTS test;\n" + "CREATE TABLE test (id INTEGER, age INTEGER, name TEXT);" + "INSERT INTO test VALUES ($id1, :age1, @name1);" + "INSERT INTO test VALUES ($id2, :age2, @name2);" + "SELECT id FROM test;" + "SELECT age,name FROM test WHERE < "$id1": 1, ":age1": 1, "@name1": "Ling", "$id2": 2, ":age2": 18, "@name2": "Paul" >);
a string containing some SQL text to execute
When the SQL statement contains placeholders, you can pass them in here. They will be bound to the statement before it is executed. If you use the params argument as an array, you cannot provide an sql string that contains several statements (separated by ; ). This limitation does not apply to params as an object.
The results of each statement
# [«export»] () →
Exports the contents of the database to a binary array
An array of bytes of the SQLite3 database file
# [«getRowsModified»] () →
Returns the number of changed rows (modified, inserted or deleted) by the latest completed INSERT, UPDATE or DELETE statement on the database. Executing any other type of SQL statement does not modify the value returned by this function.
the number of rows modified
# [«handleError»] ()
Analyze a result code, return null if no error occured, and throw an error with a descriptive message otherwise
# [«iterateStatements»] (sql) →
Iterate over multiple SQL statements in a SQL string. This function returns an iterator over Statement objects. You can use a for..of loop to execute the returned statements one by one.
a string of SQL that can contain multiple statements
the resulting statement iterator
Get the results of multiple SQL queries
const sql_queries = "SELECT 1 AS x; SELECT '2' as y"; for (const statement of db.iterateStatements(sql_queries)) < const sql = statement.getSQL(); // Get the SQL source const result = statement.getAsObject(<>); // Get the row of data console.log(sql, result); > // This will print: // 'SELECT 1 AS x;' < x: 1 >// " SELECT '2' as y"
# [«prepare»] (sql, params opt ) →
a string of SQL, that can contain placeholders ( ? , :VVV , :AAA , @AAA )
values to bind to placeholders
# [«run»] (sql, params opt ) →
Execute an SQL query, ignoring the rows it returns.
a string containing some SQL text to execute
When the SQL statement contains placeholders, you can pass them in here. They will be bound to the statement before it is executed. If you use the params argument, you cannot provide an sql string that contains several statements (separated by ; )
The database object (useful for method chaining)
// Insert values in a table db.run( "INSERT INTO test VALUES (:age, :name)", < ':age' : 18, ':name' : 'John' >);
Type Definitions
# QueryExecResult
Properties
the name of the columns of the result (as returned by Statement.getColumnNames)
one array per row, containing the column values
# SqlValue
Выполнить sql запрос javascript
Для выполнения запросов у объекта подключения применяется метод query() . Наиболее простая его форма:
Где sqlString — выполняемая SQL-команда, а callback — функция обратного вызова, через параметры которой мы можем получить результаты выполнения sql-команды или возникшую ошибку.
Например, получим все данные из таблицы:
const mysql = require("mysql2"); const connection = mysql.createConnection(< host: "localhost", user: "root", database: "usersdb", password: "123456" >); connection.query("SELECT * FROM users", function(err, results, fields) < console.log(err); console.log(results); // собственно данные console.log(fields); // мета-данные полей >); connection.end();
В данном случае выполняется команда SELECT , которая извлекает все данные из таблицы «users». Функция обратного вызова принимает три параметра. Первый параметр передает ошибка, если она возникла при выполнении запроса. Второй параметр — results собственно представляет в виде массива те данные, которые получила команда SELECT. И третий параметр fields хранит метаданные полей таблицы и дополнительную служебную информацию.
Стоит отметить, что при выполнении запросов неявно устанавливается подключение, поэтому перед выполнением запроса нам в принципе необязательно у объекта подключения вызывать метод connect() .
Также в mysql2 определен метод execute() , который работает аналогичным образом:
const mysql = require("mysql2"); const connection = mysql.createConnection(< host: "localhost", user: "root", database: "usersdb", password: "123456" >); connection.execute("SELECT * FROM users", function(err, results, fields) < console.log(err); console.log(results); // собственно данные console.log(fields); // мета-данные полей >); connection.end();
Параметризация запросов
Если в запрос надо вводить данные, которые приходят извне, то для избежания sql-инъекций рекоммендуется использовать параметризацию.
При параметризации вместо конкретных данных в тексте запроса ставятся плейсхолдеры — знаки вопроса, вместо которых при выполнении запроса будут вставляться собственно данные. Например, добавление данных:
const mysql = require("mysql2"); const connection = mysql.createConnection(< host: "localhost", user: "root", database: "usersdb2", password: "123456" >); const user = ["Tom", 29]; const sql = "INSERT INTO users(name, age) VALUES(?, ?)"; connection.query(sql, user, function(err, results) < if(err) console.log(err); else console.log("Данные добавлены"); >); connection.end();
В данном случае данные определены в виде массива user, которая в качестве параметра передается в метод connection.query() . При выполнении запроса эти данные по порядку ставляются в запрос место вопросительных знаков. То есть фактически запрос будет выглядеть так: INSERT INTO users(name, age) VALUES(«Tom», 29)
HTML 5. Работа с Web SQL базой данных
В HTML 5 есть много новых возможностей, которые позволяют web разработчикам создавать более мощные и насыщенные приложения. К этим возможностям относятся и новые способы хранения данных на клиенте, такие как web storage(поддерживается в IE8) и web SQL database.
При этом если web storage ориентирован на хранение пар ключ-значение, то в случае с web SQL database у нас есть полноценный sqlite(во всех текущих реализациях применяется именно этот движок баз данных, что является проблемой при стандартизации).
Далее я расскажу, как работать с web SQL database. При этом примеры естественно будут на JavaScript. Кроме того, стоит отметить, что с поддержкой браузерами всего этого хозяйства дела обстоят, не очень хорошо, но всё постепенно меняется к лучшему и, скажем, в Opera 10.50 поддержка будет, а браузерах на движке WebKit она уже есть. Более подробно про то, какой браузер, что поддерживает можно узнать, пройдя по ссылке.
Соединение с базой данных.
Подсоединиться к базе данных очень просто:
db = openDatabase(«ToDo», «0.1», «A list of to do items.», 200000);
Данный код создаёт объект, представляющий БД, а если базы данных с таким именем не существует, то создаётся и она. При этом в аргументах указывается имя базы данных, версия, отображаемое имя и приблизительный размер. Кроме того важно отметить, что приблизительный размер не является ограничением. Реальный размер базы данных может изменяться.
Успешность подключения к БД можно оценить, проверив объект db на null:
Всегда предпринимайте данную проверку, даже если соединение с БД для данного пользователя уже производилось в прошлом, и было успешно. Могут измениться настройки безопасности, закончиться дисковое пространство (скажем, если пользователь использует смартфон) или фаза луны окажется неподходящей.
Выполнение запросов.
Для выполнения запросов к БД предварительно надо создать транзакцию, вызвав функцию database.transaction(). У неё один аргумент, а именно другая JavaScript функция, принимающая объект транзакции и предпринимающая запросы к базе данных.
- строка SQL запроса
- массив параметров запроса (параметры подставляются на место вопросительных знаков в SQL запросе)
- функция, вызываемая при успешном выполнении запроса
- функция, вызываемая в случае возникновения ошибки выполнения запроса
db.transaction(function(tx) tx.executeSql(«SELECT COUNT(*) FROM ToDo», [], function(result)<>, function(tx, error)<>);
>);
Давайте теперь изменим код так, чтобы при невозможности выборки из таблицы «ToDo»(которой пока не существует), данная таблица создавалась.
db.transaction(function(tx) tx.executeSql(«SELECT COUNT(*) FROM ToDo», [], function (result) < alert('dsfsdf') >, function (tx, error) tx.executeSql(«CREATE TABLE ToDo (id REAL UNIQUE, label TEXT, timestamp REAL)», [], null, null);
>)>);
Вставка данных.
Давайте вставим новую строку в таблицу «ToDo». Для знакомых с синтаксисом SQL пример, приведённый ниже, покажется очень знакомым:
db.transaction(function(tx) tx.executeSql(«INSERT INTO ToDo (label, timestamp) values(?, ?)», [«Купить iPad или HP Slate», new Date().getTime()], null, null);
>);
Первый знак вопроса в SQL запросе заменяется на «Купить iPad или HP Slate», а второй на метку времени. В итоге выполнен будет примерно такой запрос:
INSERT INTO ToDo (label, timestamp) values («Купить iPad или HP Slate», 1265925077487)
Работа с результатами запросов.
Результат выполнения запроса на выборку данных содержит набор строк, а каждая строка содержит значения столбцов таблицы для данной строки.
Вы можете получить доступ к какой-либо строке результата вызвав функцию result.rows.item(i), где i – индекс строки. Далее, для получения требуемого значения, нужно обратиться к конкретному столбцу по имени – result.rows.item(i)[ «label»].
Следующий пример выводит результат запроса к базе данных на страницу:
db.transaction(function(tx) tx.executeSql(«SELECT * FROM ToDo», [], function(tx, result) for(var i = 0; i < result.rows.length; i++) document.write('‘ + result.rows.item(i)[‘label’] + ‘
‘);
>>, null)>);
Заключение.
Использование web SQL database предоставляет мощные возможности, но не стоит увлекаться. Если задачу можно решить с помощью web storage, лучше использовать его.
Вы можете найти дополнительную информацию по данной теме в соответствующем разделе сайта консорциуме w3c.
Также для web SQL database уже начали разрабатывать ORM библиотеки. Пример такой библиотеки тут.