문제

luasql, LUA의 대부분의 SQL 데이터베이스 시스템의 표준 라이브러리 인 것 같습니다. 쿼리에서 값을 인용/탈출 할 수있는 시설이없는 것 같습니다. Sqlite를 백엔드로 사용하는 응용 프로그램을 작성하고 있으며 다음과 같은 인터페이스를 사용하고 싶습니다. 파이썬의 DB-API:

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

그러나 나는 심지어 멍청한 무언가에 대해 다음과 같이 정착합니다.

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

SQLITE에 대한 인용을 지원하는 다른 LUA 라이브러리가 있습니까? (luasqlite3 그렇지 않은 것 같습니다.) 또는 luasql에 대해 뭔가를 놓치고 있습니까? 나는 내 자신의 솔루션 (Regexes 또는 무언가)을 굴려서 잘못 생각하는 것에 대해 걱정합니다. 래퍼를 작성해야합니다 sqlite3_snprintf?

도움이 되었습니까?

해결책

나는 한동안 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

다른 팁

luasqlite3 뿐만 아니라 SQLITE에 대한 다른 낮은 수준의 결합은 가변 매개 변수로 준비된 진술을 제공합니다. 이러한 방법을 사용하여 값을 명령문 매개 변수에 바인딩합니다. SQLITE는 결합 값을 해석하지 않기 때문에 SQL 주입의 가능성은 없습니다. 이것은 지금까지 가장 안전하고 가장 잘 수행하는 접근 방식입니다.

UROC는 준비된 명령문과 함께 BIND 방법을 사용하는 예를 보여줍니다.

그런데 Lua SQL에는 Conn : Conn이 연결 변수 인 Escape의 SQLITE3 드라이버에 대한 문서화되지 않은 탈출 기능이 있습니다.

예를 들어 코드로

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

결과는 다음과 같습니다.

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

나는 실제로 그것이 무엇을하는지 보려고 노력했다. 분명히 Postgres 드라이버에도 그러한 기능도 있습니다. 나는 그들이 가진 시험을 보면서 이것을 발견했다.

도움이 되었기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top