OneScript.Web icon indicating copy to clipboard operation
OneScript.Web copied to clipboard

База данных в памяти (SQLite)

Open pallid opened this issue 6 years ago • 30 comments

Использование в памяти невозможно, так как при вызовах методов происходит открытие базы, в случаи с инменори это обозначает создание базы.

pallid avatar Dec 16 '18 18:12 pallid

Есть еще проблема, после решения вопроса с инмемори все таки не получается обратиться к базе из контроллера. Т.е все действия в модуле в момент запуска проходят, но при обращении с контроллера к базе, идет обращение как будто к другому инстансу БД

т.е из модуля в DataSourse = "", а вот при вызове из контроллера, там уже указано ":memory:"

pallid avatar Dec 16 '18 19:12 pallid

т.е из модуля в DataSourse = "", а вот при вызове из контроллера, там уже указано ":memory:"

в общем пришлось сначала сделать вызов инициализации базы из контроллера, а не при старте приложения, но это как-то не очень

pallid avatar Dec 17 '18 06:12 pallid

@EvilBeaver @dmpas

подскажите как победить проблему с инициализацией базы при старте и отсутствия ее при дальнейшего вызова из контроллеров

pallid avatar Dec 17 '18 09:12 pallid

К базе обращаться в ПриНачалеРаботыСистемы, когда еще ни один контроллер не принимает вызовы.

EvilBeaver avatar Dec 17 '18 12:12 EvilBeaver

Перенес создание базы в основной модуль, такая же ситуация, при обращении из контроллера пишет no such table

pallid avatar Dec 17 '18 12:12 pallid

В общем разница в DataSource при инициализации из ПриНачалеРаботыСистемы и обращения из контроллера

ПриНачалеРаботыСистемы: 2018-12-17_17-25-43

Контроллер: 2018-12-17_17-26-25

pallid avatar Dec 17 '18 14:12 pallid

Надо разобраться с shared. Без этого не заработает, треды разные.

nixel2007 avatar Dec 17 '18 14:12 nixel2007

Пробовал "Data Source=:memory:;Mode=Memory;Cache=Shared"

пока безрезультатно

pallid avatar Dec 17 '18 16:12 pallid

Я тоже порядком времени убил, у меня заработало только с FileUri. Надо понять, почему он не работает в ос.веб.

nixel2007 avatar Dec 17 '18 18:12 nixel2007

FileUri вроде как из Microsoft.Data.Sqlite, точнее из SQLitePCLRaw, версии >= 1.08

а в ос.веб Microsoft.Data.Sqlite был впоследствии заменен на ранее уже применяемый Microsoft.EntityFrameworkCore

pallid avatar Dec 17 '18 19:12 pallid

Чтобы было понимание: механики работы с базой данных считай отсутствуют. Нужна помощь в реализации и построении идеологического концепта, который мы предложим сообществу.

EvilBeaver avatar Dec 18 '18 08:12 EvilBeaver

@EvilBeaver есть набросок концепции?

pallid avatar Dec 18 '18 09:12 pallid

просто проблема с базой в памяти, с удаленной базой нет вроде проблем

pallid avatar Dec 18 '18 09:12 pallid

@EvilBeaver есть набросок концепции?

Изначально думалось, что будет как в 1С - одна ИБ и в ней некий ORM Потом @nixel2007 придумал библиотеку entity. Она ложится на изначальную идею, но ей нужен "адаптер" к веб-движку. И требования к такому адаптеру

Полагаю, что из "требований к адаптеру" и можно сформулировать то, что должен уметь движок.

EvilBeaver avatar Dec 18 '18 09:12 EvilBeaver

Адаптер-то уже есть. Там нужно пару строк подправить, чтобы он научился работать в вебе (руки не доходят, как обычно). И реализовать lastInsertedId, чтобы не велосипедить пакетные запросы

nixel2007 avatar Dec 18 '18 11:12 nixel2007

Адаптер-то уже есть. Там нужно пару строк подправить, чтобы он научился работать в вебе (руки не доходят, как обычно). И реализовать lastInsertedId, чтобы не велосипедить пакетные запросы

Вот не смог найти ни у @nixel2007 ни у @asosnoviy в репах

pallid avatar Dec 18 '18 11:12 pallid

чтобы не велосипедить пакетные запросы

А что там про пакетные запросы? Просто lastId есть далеко не во всех СУБД

EvilBeaver avatar Dec 18 '18 12:12 EvilBeaver

@pallid локально в стэшах :/

@EvilBeaver в субд, где нет lastId он обычно возвращается как результат инсерта. Но если и там нет, то да, придётся велосипедить, правда нет уверенности, что на всех типах ключей это получится

nixel2007 avatar Dec 18 '18 15:12 nixel2007

@nixel2007 вот я и говорю, что получение последнего ИД это тоже к адаптеру entity вопрос, а не к движку. А движок должен дать что-то более универсальное (например, результат последнего инсерта) Короче, тут думать надо, но задача решаемая.

EvilBeaver avatar Dec 19 '18 21:12 EvilBeaver

@EvilBeaver а движку вообще не нужен ид последней записи. Он нужен чтобы заполнить ид в сущности, предоставить этот ид - задача адаптера, а как он будет это делать - это уже его головная боль.

nixel2007 avatar Dec 20 '18 03:12 nixel2007

Это я понимаю. Но адаптер-то где ее будет брать?

EvilBeaver avatar Dec 24 '18 09:12 EvilBeaver

адаптер к sqlite (который использует sql из библиотеки) берет его из lastInstertedId, которая у @ret-phoenix реализован для sqlite. если кто-то возьмется делать адаптер для постгреса, то надо либо научить библиотеку sql возвращать LII для постгреса, либо велосипедить пакетный запрос (либо еще внимательнее курить документацию, авось это есть :) ).

nixel2007 avatar Dec 24 '18 09:12 nixel2007

а в постгрес вроде так

INSERT INTO ....
RETURNING id

pallid avatar Dec 24 '18 10:12 pallid

либо велосипедить пакетный запрос

Что ты имеешь в виду?

EvilBeaver avatar Dec 24 '18 15:12 EvilBeaver

@EvilBeaver что-то типа Insert value to table; Select max(id) from table;

nixel2007 avatar Dec 24 '18 18:12 nixel2007

Интересно, как EntityFramework это делает?

EvilBeaver avatar Dec 25 '18 06:12 EvilBeaver

https://www.postgresql.org/docs/current/dml-returning.html

ret-Phoenix avatar Dec 25 '18 18:12 ret-Phoenix

@ret-Phoenix ну вот и получается, что каждая СУБД имеет свой набор костылей. Я пытался гуглить по MSSQL и вроде бы там вообще нет надежного средства, только условно возможные...

EvilBeaver avatar Dec 26 '18 06:12 EvilBeaver

@EvilBeaver дык а кто отрицал?

nixel2007 avatar Dec 26 '18 10:12 nixel2007

Оставлю work around: Если стартовать в docker compose - можно разместить базу в tmpfs и получится "почти инмемори".

zeratulayuris avatar Sep 04 '19 07:09 zeratulayuris