Что нового

Общий доступ к Sqlite базе в RAM

Core2Duo76

Новичок
Сообщения
58
Репутация
1
На сайте Sqlite написано, что можно подключиться к :memory: базе, если создать новую с именем 'file:memdb1?mode=memory&cache=shared'. Ради теста сделал скрипт, который висит в памяти и держит там таблицу. Делаю второй скрипт, который показывает через _arrayDisplay таблицу, но Sqlite отвечает с ошибкой "no such table ***", и чей это косяк? мне кажется, что соединение к существующей RAM базе не произошло, хоть и после _sqlite_open() в @error был 0. Реально ли подключиться к существующей базе?

Код скрипта, который первый, компилированный запущен перед выполнением второго.

Код:
#include <sqlite.au3>

_SQLite_Startup()
$DB=_SQLite_Open(':memory:')

_SQLite_Exec($DB,'CREATE TABLE test (id); INSERT INTO test VALUES (1),(2),(3)')

Sleep(100000000)


Второй:
Код:
#include <array.au3>

_SQLite_Startup()
$DB = _SQLite_Open(':memory:')
_SQLite_Exec($DB, 'ATTACH DATABASE ''file:memdb1?mode=memory&cache=shared'' AS SHARED;')
ConsoleWrite('error=' & @error & @CRLF)
Dim $t, $r, $c

_SQLite_GetTable2d($DB, 'SELECT * FROM SHARED.test', $t, $r, $c)
_ArrayDisplay($t)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Dll SQLite3 должна лежать рядом или укажите к ней путь.
Код:
#include <SQLite.au3>
#include <array.au3>

Local $t, $r, $c, $aResult

_SQLite_Startup()
$DB =_SQLite_Open(':memory:')
_SQLite_Exec($DB,'CREATE TABLE test (id); INSERT INTO test VALUES (1),(2),(3)')
_SQLite_Exec($DB, "ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS SHARED;")

_SQLite_GetTable2d($DB, 'SELECT * FROM test', $t, $r, $c)
_ArrayDisplay($t)
_SQLite_Close()
_SQLite_Shutdown()
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Вы меня не поняли - скрипта два! Два, понимаете? Не один. Другими словами - есть один, а к нему прилагается второй. В сумме - все верно, два! Один в EXE держит в памяти БД, второй с ней работает. Второй будет размножен апосля компиляции, и каждая из копий будет заниматься своими делами, заливая результаты в память первого скрипта (напомню, который держит БД). Вопрос тоже уточню - что я делаю не так, что не могу подключиться в БД в памяти скрипта 1 из скрипта 2? Где ошибка в скрипте 2 ?
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Попробуй так:

Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>

Local $hQuery, $aRow
_SQLite_Startup()
$DB = _SQLite_Open('file:memdb1?mode=memory&cache=shared')

_SQLite_Exec($DB, 	"CREATE TABLE tblTest2 (id int); "& _
					"INSERT INTO tblTest2 VALUES (1);")

Local $d = _SQLite_Exec($DB, "Select id From tblTest2", "_cb") ; _cb will be called for each row

_SQLite_Close()
_SQLite_Shutdown()

_SQLite_Startup()
	$DB = _SQLite_Open("file:memdb1?mode=memory&cache=shared")

;~ ----------------------------
;~ 	Local $d = _SQLite_Exec($DB, "select * from sqlite_master where type = 'table'", "_cb") ; _cb will be called for each row
;~ 	Выведет список всех баз в памяти
;~ ----------------------------

	Local $d = _SQLite_Exec($DB, "Select * From `tblTest2`", "_cb") ; _cb will be called for each row

_SQLite_Close()
_SQLite_Shutdown()

Func _cb($aRow)
    For $s In $aRow
        ConsoleWrite($s & @TAB)
    Next
    ConsoleWrite(@CRLF)
EndFunc   ;==>_cb



Вывод уже пришлось тестить на базе "tblTest3"
Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>

Local $hQuery, $aRow
_SQLite_Startup()
$DB = _SQLite_Open('file:memdb1?mode=memory&cache=shared')

_SQLite_Exec($DB, 	"CREATE TABLE tblTest3 (id int); "& _
					"INSERT INTO tblTest3 VALUES (1),(2);")

Local $d = _SQLite_Exec($DB, "Select id From tblTest3", "_cb") ; _cb will be called for each row

_SQLite_Close()
_SQLite_Shutdown()

_SQLite_Startup()
	$DB = _SQLite_Open("file:memdb1?mode=memory&cache=shared")

;~ ----------------------------
	Local $d = _SQLite_Exec($DB, "select * from sqlite_master where type = 'table'", "_cb") ; _cb will be called for each row
;~ 	Выведет список всех баз в памяти
;~ ----------------------------

	Local $d = _SQLite_Exec($DB, "Select * From `tblTest3`", "_cb") ; _cb will be called for each row

_SQLite_Close()
_SQLite_Shutdown()

Func _cb($aRow)
    For $s In $aRow
        ConsoleWrite($s & @TAB)
    Next
    ConsoleWrite(@CRLF)
EndFunc   ;==>_cb
Код:
id	
1	
2	
type	name	tbl_name	rootpage	sql	
table	tblTest	tblTest	2	CREATE TABLE tblTest (a,b int,c single not null)	
table	tblTest2	tblTest2	3	CREATE TABLE tblTest2 (id int)	
table	tblTest3	tblTest3	4	CREATE TABLE tblTest3 (id int)	
id	
1	
2

PS: Вывод всех баз:
Код:
Local $d = _SQLite_Exec($DB, "select * from sqlite_master where type = 'table'", "_cb") ; _cb will be called for each row




Если использовать:
Код:
$DB = _SQLite_Open(':memory:')
Local $d = _SQLite_Exec($DB, "select * from sqlite_master where type = 'table'", "_cb")

То вывод всех баз будет пустым, т.е. не подключается к базам в памяти:
Код:
--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
type	name	tbl_name	rootpage	sql	
+>16:42:37 AutoIt3.exe ended.rc:0
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
ты своим
_SQLite_Close()
_SQLite_Shutdown()
убиваешь БД в памяти.

Неужели что-то пишу непонятно? два скрипта. Я даже их код дал. скомпилируй первый, запусти - он будет держать БД. Вторым попробуй выжать из БД таблицу. Тебе будет ошибка "NO SUCH TABLE test", значит подключение к БД не удалось, хоть и @error после _sqlite_exec() равна нулю.
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Блин, я нв хабре читал, там формулировка была смутная. Печаль, печаль, мне покащалось, что вроде подключаться к памяти другого процесса нельзя. Оказалось, не казалось. Всем спасибо!
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Core2Duo76 сказал(а):
ты своим
_SQLite_Close()
_SQLite_Shutdown()
убиваешь БД в памяти.
С чего ты так решил ? У меня же есть вывод данных о всех таблицах после "_SQLite_Shutdown()" и ничег острашного - имеется вывод. Даже ПК выключал и включал... перезагружал и т.п.

Почему тогда у меня при выводе всех таблиц получается:
Код:
type	name	tbl_name	rootpage	sql	
table	tblTest	tblTest	2	CREATE TABLE tblTest (a,b int,c single not null)	
table	tblTest2	tblTest2	3	CREATE TABLE tblTest2 (id int)	
table	tblTest3	tblTest3	4	CREATE TABLE tblTest3 (id int)
Core2Duo76 сказал(а):
Неужели что-то пишу непонятно? два скрипта. Я даже их код дал. скомпилируй первый, запусти - он будет держать БД. Вторым попробуй выжать из БД таблицу. Тебе будет ошибка "NO SUCH TABLE test", значит подключение к БД не удалось, хоть и @error после _sqlite_exec() равна нулю.
Почему тебе не созать ДВА скрипта:

PS: создал два скрипта после ** дней...

Первый - просто создает базу данных, в трее не висит по слипу и т.п.:
Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>

Local $hQuery, $aRow

_SQLite_Startup()
$DB = _SQLite_Open('file:memdb1?mode=memory&cache=shared')

_SQLite_Exec($DB,   "CREATE TABLE tblTest2 (id int); "& _
                    "INSERT INTO tblTest2 VALUES (1);")

Local $d = _SQLite_Exec($DB, "Select id From tblTest2", "_cb") ; _cb will be called for each row

_SQLite_Close()
_SQLite_Shutdown()

Func _cb($aRow)
    For $s In $aRow
        ConsoleWrite($s & @TAB)
    Next
    ConsoleWrite(@CRLF)
EndFunc   ;==>_cb


Второй - выводит список всех таблиц + выводит содержимое таблицы tblTest2:
Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>

Local $hQuery, $aRow

_SQLite_Startup()
    $DB = _SQLite_Open("file:memdb1?mode=memory&cache=shared")

;~ ----------------------------
 Local $d = _SQLite_Exec($DB, "select * from sqlite_master where type = 'table'", "_cb") ; _cb will be called for each row
;~  Выведет список всех баз в памяти
;~ ----------------------------

    Local $d = _SQLite_Exec($DB, "Select * From `tblTest2`", "_cb") ; _cb will be called for each row

_SQLite_Close()
_SQLite_Shutdown()

Func _cb($aRow)
    For $s In $aRow
        ConsoleWrite($s & @TAB)
    Next
    ConsoleWrite(@CRLF)
EndFunc   ;==>_cb


PS: лично я запустил первыйи получил:
Код:
!   SQLite.au3 Error
--> Function: _SQLite_Exec
--> Query:    CREATE TABLE tblTest2 (id int); INSERT INTO tblTest2 VALUES (1);
--> Error:    table tblTest2 already exists

id	
1
Ошибка вылезла по причине того, что tblTest2 уже существует.

Едем дальше - запускаем второй скрипт и получаем:
Код:
type	name	tbl_name	rootpage	sql	
table	tblTest	tblTest	2	CREATE TABLE tblTest (a,b int,c single not null)	
table	tblTest2	tblTest2	3	CREATE TABLE tblTest2 (id int)	
table	tblTest3	tblTest3	4	CREATE TABLE tblTest3 (id int)	
id	
1


Хотя быть может я подключаюсь через "file:memdb1?mode=memory&cache=shared"
 
Верх