Как процитировать значения для LuaSQL? - PullRequest
0 голосов
/ 04 августа 2009

LuaSQL , который представляется канонической библиотекой для большинства систем баз данных SQL в Lua, похоже, не имеет каких-либо возможностей для цитирования / экранирования значений в запросах. Я пишу приложение, которое использует SQLite в качестве бэкэнда, и я бы хотел использовать интерфейс, подобный тому, который указан в DB-API Python :

c.execute('select * from stocks where symbol=?', t)

но я бы даже согласился на что-то еще тупее, например:

conn:execute("select * from stocks where symbol=" + luasql.sqlite.quote(t))

Существуют ли другие библиотеки Lua, которые поддерживают цитирование для SQLite? ( LuaSQLite3 не похоже.) Или я что-то упускаю в LuaSQL? Я беспокоюсь о том, чтобы развернуть свое собственное решение (с помощью регулярных выражений или чего-то подобного) и ошибиться. Должен ли я просто написать оболочку для sqlite3_snprintf ?

Ответы [ 3 ]

4 голосов
/ 04 августа 2009

LuaSQLite3 , а также любая другая низкоуровневая привязка к SQLite предлагает подготовленные операторы с переменными параметрами; они используют методы для привязки значений к параметрам оператора. Поскольку SQLite не интерпретирует значения привязки, просто нет возможности внедрения SQL. Это, безусловно, самый безопасный (и наиболее эффективный) подход.

uroc показывает пример использования методов связывания с подготовленными операторами.

4 голосов
/ 04 августа 2009

Я давно не смотрел на LuaSQL, но в прошлый раз проверял, что он не поддерживает. Я использую Lua-Sqlite3.

require("sqlite3")

db = sqlite3.open_memory()

db:exec[[ CREATE TABLE tbl( first_name TEXT, last_name TEXT ); ]]

stmt = db:prepare[[ INSERT INTO tbl(first_name, last_name) VALUES(:first_name, :last_name) ]]

stmt:bind({first_name="hawkeye", last_name="pierce"}):exec()
stmt:bind({first_name="henry", last_name="blake"}):exec()

for r in db:rows("SELECT * FROM tbl") do
    print(r.first_name,r.last_name)
end
2 голосов
/ 25 сентября 2010

Кстати, в Lua SQL есть недокументированная escape-функция для драйвера sqlite3 в conn: escape, где conn - переменная соединения.

Например, с кодом

print ("con:escape works. test'test = "..con:escape("test'test"))

результат:

con:escape works. test'test = test''test

Я действительно попробовал это, чтобы увидеть, что это сделает. Очевидно, есть и такая функция для их драйвера postgres. Я нашел это, посмотрев на тесты, которые у них были.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...