Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
pallid opened this issue Dec 16, 2018 · 30 comments
Open

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

pallid opened this issue Dec 16, 2018 · 30 comments

Comments

@pallid
Copy link
Contributor

pallid commented Dec 16, 2018

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

@pallid
Copy link
Contributor Author

pallid commented Dec 16, 2018

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

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

@pallid
Copy link
Contributor Author

pallid commented Dec 17, 2018

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

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

@pallid
Copy link
Contributor Author

pallid commented Dec 17, 2018

@EvilBeaver @dmpas

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

@EvilBeaver
Copy link
Owner

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

@pallid
Copy link
Contributor Author

pallid commented Dec 17, 2018

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

@pallid
Copy link
Contributor Author

pallid commented Dec 17, 2018

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

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

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

@nixel2007
Copy link
Contributor

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

@pallid
Copy link
Contributor Author

pallid commented Dec 17, 2018

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

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

@nixel2007
Copy link
Contributor

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

@pallid
Copy link
Contributor Author

pallid commented Dec 17, 2018

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

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

@EvilBeaver
Copy link
Owner

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

@pallid
Copy link
Contributor Author

pallid commented Dec 18, 2018

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

@pallid
Copy link
Contributor Author

pallid commented Dec 18, 2018

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

@EvilBeaver
Copy link
Owner

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

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

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

@nixel2007
Copy link
Contributor

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

@pallid
Copy link
Contributor Author

pallid commented Dec 18, 2018

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

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

@EvilBeaver
Copy link
Owner

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

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

@nixel2007
Copy link
Contributor

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

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

@EvilBeaver
Copy link
Owner

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

@nixel2007
Copy link
Contributor

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

@EvilBeaver
Copy link
Owner

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

@nixel2007
Copy link
Contributor

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

@pallid
Copy link
Contributor Author

pallid commented Dec 24, 2018

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

INSERT INTO ....
RETURNING id

@EvilBeaver
Copy link
Owner

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

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

@nixel2007
Copy link
Contributor

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

@EvilBeaver
Copy link
Owner

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

@ret-Phoenix
Copy link

@EvilBeaver
Copy link
Owner

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

@nixel2007
Copy link
Contributor

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

@zeratulayuris
Copy link
Contributor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants