{"id":485553,"date":"2026-06-29T21:38:13","date_gmt":"2026-06-29T21:38:13","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=485553"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=485553","title":{"rendered":"\u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430: \u0443\u0445\u043e\u0434\u0438\u043c \u043e\u0442 EF Core \u2014 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u0430, \u043c\u043e\u0431\u0430\u0439\u043b\u0430 \u0438 Blazor WASM"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a1\/0a9\/b30\/1a10a9b3006d001de03a032a33ad05d7.webp\" width=\"1024\" height=\"1024\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1a1\/0a9\/b30\/1a10a9b3006d001de03a032a33ad05d7.webp 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a1\/0a9\/b30\/1a10a9b3006d001de03a032a33ad05d7.webp 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>\u0421\u0435\u0440\u0438\u044f:<\/strong> redb ecosystem (\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u043e\u0441\u043b\u0435 \u0430\u043d\u043e\u043d\u0441\u0430 3.2.1)<\/p>\n<h3>\u041e \u0447\u0451\u043c \u044d\u0442\u043e<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430\u00a0<a href=\"https:\/\/habr.com\/ru\/posts\/1049288\/\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0448\u0435\u043b SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 3.2.1<\/a>, \u0430\u043d\u043e\u043d\u0441 \u0431\u044b\u043b \u043d\u0430 \u043f\u0430\u0440\u0443 \u0430\u0431\u0437\u0430\u0446\u0435\u0432: \u00ab\u0442\u043e\u0442 \u0436\u0435 LINQ, \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 DI\u00bb. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043d\u043e\u043d\u0441\u0430. \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u00ab\u0447\u0442\u043e \u0432\u044b\u0448\u043b\u043e\u00bb, \u0430\u00a0<strong>\u043a\u0430\u043a \u043e\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438 \u0433\u0434\u0435 \u0443 \u043d\u0430\u0441 \u043f\u043e\u0442\u0435\u043a\u043b\u043e<\/strong>. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e: \u043a\u0430\u043a \u0434\u0432\u0438\u0436\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 redb \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 C-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0443 \u0431\u0430\u0437\u044b \u043d\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u043a; \u043a\u0430\u043a \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c\u00a0<code>DateTimeOffset<\/code>\u00a0\u0432 \u0431\u0430\u0437\u0435, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u0442\u0438\u043f\u0430 \u00ab\u0434\u0430\u0442\u0430\u00bb; \u0438 \u0442\u0440\u0438 \u0431\u0430\u0433\u0430 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440-JSON, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c SQL \u0438 \u0444\u0438\u043a\u0441\u043e\u043c.<\/p>\n<p>\u042d\u0442\u043e \u0434\u043b\u0438\u043d\u043d\u043e \u0438 \u0441 \u043a\u043e\u0434\u043e\u043c. \u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u2014 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0430\u043d\u043e\u043d\u0441 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u044b\u0448\u0435. \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u00ab\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 DI\u00bb, \u2014 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435\u0441\u044c.<\/p>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u043e redb \u0432\u043f\u0435\u0440\u0432\u044b\u0435 (\u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435):<\/p>\n<blockquote>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1042058\/\" rel=\"noopener noreferrer nofollow\">redb \u2014 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f .NET \u043f\u043e\u0432\u0435\u0440\u0445 Postgres\/MSSQL: \u0431\u0435\u0437 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439, \u0431\u0435\u0437 Include, \u0441 \u043f\u043e\u043b\u043d\u044b\u043c LINQ<\/a>\u00a0\u2014 \u0447\u0442\u043e \u044d\u0442\u043e \u0438 \u0437\u0430\u0447\u0435\u043c.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1043790\/\" rel=\"noopener noreferrer nofollow\">REDB \u0438\u0437\u043d\u0443\u0442\u0440\u0438, \u0441\u0442\u0430\u0442\u044c\u044f 1: 13 \u0442\u0430\u0431\u043b\u0438\u0446, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0451<\/a>\u00a0\u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.\u00a0<strong>\u041a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438:<\/strong>\u00a0SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0443 \u0435\u0451 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043e\u0434\u0438\u043d-\u0432-\u043e\u0434\u0438\u043d.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1045208\/\" rel=\"noopener noreferrer nofollow\">REDB: \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u2014 \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e<\/a>\u00a0\u2014 \u0438\u043d\u0434\u0435\u043a\u0441\u044b.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/posts\/1049288\/\" rel=\"noopener noreferrer nofollow\">SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0434\u043b\u044f RedBase \u2014 \u0430\u043d\u043e\u043d\u0441 3.2.1<\/a>\u00a0\u2014 \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u0433\u043b\u0443\u0431\u044c.<\/p>\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>\u0418 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p><strong>\u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u043f\u0440\u043e \u0442\u0435\u0440\u043c\u0438\u043d.<\/strong>\u00a0\u0414\u0430, \u0443 redb \u00ab\u0433\u0438\u0431\u043a\u0430\u044f\u00bb \u043c\u043e\u0434\u0435\u043b\u044c: \u043a\u043b\u0430\u0441\u0441 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u0435\u0442, \u044d\u0442\u043e\u00a0<strong>\u043d\u0435 EAV<\/strong>\u00a0\u0432 \u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0432 \u043a\u0430\u043a\u043e\u043c \u044d\u0442\u043e \u0441\u043b\u043e\u0432\u043e \u0431\u0440\u043e\u0441\u0430\u044e\u0442 \u043a\u0430\u043a \u0440\u0443\u0433\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e. \u0412 \u0431\u0430\u0437\u0435 redb \u043b\u0435\u0436\u0438\u0442\u00a0<strong>RTTI<\/strong>\u00a0\u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u0438\u043f\u0430\u0445: \u0441\u0445\u0435\u043c\u044b, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u0438\u043f\u044b \u043f\u043e\u043b\u0435\u0439, \u0441\u0432\u044f\u0437\u0438. \u0411\u0414\u00a0<em>\u0437\u043d\u0430\u0435\u0442<\/em>, \u0447\u0442\u043e\u00a0<code>EmployeeProps.HireDate<\/code>\u00a0\u2014 \u044d\u0442\u043e\u00a0<code>DateTime<\/code>, \u0447\u0442\u043e\u00a0<code>Contacts<\/code>\u00a0\u2014 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430\u00a0<code>CurrentProject<\/code>\u00a0\u2014 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0445\u0435\u043c\u0443. \u042d\u0442\u043e \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0430 \u043d\u0435 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0441\u044f \u0441\u0430\u043c\u00bb. \u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, \u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0431\u044b \u2014 \u0438\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0438\u043b\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0442.<\/p>\n<p><strong>\u0412\u0442\u043e\u0440\u043e\u0439 \u2014 \u043f\u0440\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0439.<\/strong>\u00a0redb \u2014 \u0434\u043b\u044f\u00a0<strong>\u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/strong>: \u0433\u0440\u0430\u0444\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u0441\u0441\u044b\u043b\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u0445\u0435\u043c\u0430\u043c\u0438, \u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0421\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e\u00a0<strong>\u043f\u043b\u043e\u0441\u043a\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/strong>\u00a0\u2014 \u043f\u043e\u0442\u043e\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044e \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u2014 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u044d\u0442\u043e\u00a0<strong>\u0430\u043d\u0442\u0438\u043f\u0430\u0442\u0442\u0435\u0440\u043d<\/strong>. \u041f\u043e\u0434 \u0442\u0430\u043a\u043e\u0435 \u0435\u0441\u0442\u044c time-series \u0438 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u044b\u0435 \u0431\u0430\u0437\u044b; redb \u043f\u043b\u0430\u0442\u0438\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0438 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u043e\u0433\u0430\u0442\u044b\u0435 \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0435, \u0430 \u043d\u0435 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0434\u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430\u00a0<code>(timestamp, value)<\/code>\u00a0\u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u044b \u0441\u0442\u0440\u043e\u043a. \u041a\u043e\u0440\u043e\u0442\u043a\u043e: redb \u0441\u0438\u043b\u0451\u043d \u0442\u0430\u043c, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c\u00a0<strong>\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0434\u043e\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/strong>.<\/p>\n<hr\/>\n<h3>\u0427\u0430\u0441\u0442\u044c 0. \u0420\u0430\u0437\u0432\u0438\u043b\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435<\/h3>\n<p>\u0423 SQLite\u00a0<strong>\u043d\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430<\/strong>. \u041d\u0438 PL\/pgSQL, \u043d\u0438 T-SQL \u2014 \u043d\u0438\u0447\u0435\u0433\u043e, \u0432\u043e \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u0410 \u00ab\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439\u00bb \u0442\u0438\u0440 redb \u043d\u0430 Postgres \u0438 MSSql \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a: \u0442\u044f\u0436\u0451\u043b\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0435\u0440\u0438\u044f (\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, soft-delete, view \u043f\u0440\u0430\u0432) \u0436\u0438\u0432\u0451\u0442\u00a0<strong>\u0432\u043d\u0443\u0442\u0440\u0438 \u0411\u0414<\/strong>\u00a0\u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u0430 Free\/Pro: \u0433\u0434\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f JSON \u0438 \u043a\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0442 SQL.<\/p>\n<p>\u0418\u0437 \u00ab\u043d\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u043a\u00bb \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0440\u043e\u0432\u043d\u043e \u0434\u0432\u0430 \u043f\u0443\u0442\u0438, \u0438 \u043c\u044b \u043f\u043e\u0448\u043b\u0438 \u043e\u0431\u043e\u0438\u043c\u0438 \u2014 \u043d\u0430 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u0440\u0430:<\/p>\n<p><strong>Pro \u2014 \u0447\u0438\u0441\u0442\u044b\u0439 C#.<\/strong>\u00a0SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u00a0<code>ProSqlBuilder<\/code>\u00a0\u0432 \u043a\u043e\u0434\u0435, props \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435,\u00a0<strong>\u043d\u043e\u043b\u044c<\/strong>\u00a0\u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0411\u0414. \u0421\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c\u00a0<a href=\"http:\/\/Microsoft.Data\" rel=\"noopener noreferrer nofollow\"><code>Microsoft.Data<\/code><\/a><code>.Sqlite<\/code>\u00a0\u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u044f\u00a0<strong>Blazor WebAssembly<\/strong>\u00a0\u0438\u00a0<strong>\u043c\u043e\u0431\u0438\u043b\u043a\u0438 (MAUI\/iOS\/Android)<\/strong>, \u0433\u0434\u0435 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 SQLite \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435.<\/p>\n<p><strong>Free \u2014 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 C-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435.<\/strong>\u00a0\u0422\u043e\u0442 \u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434, \u0447\u0442\u043e \u043d\u0430 Postgres\/MSSql: \u0434\u0432\u0438\u0436\u043e\u043a \u0436\u0438\u0432\u0451\u0442\u00a0<em>\u0432 \u0431\u0430\u0437\u0435<\/em>. \u041d\u0430 SQLite \u00ab\u0432 \u0431\u0430\u0437\u0435\u00bb \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 C (<code>redb.dll<\/code>\u00a0\/\u00a0<code>.so<\/code>\u00a0\/\u00a0<code>.dylib<\/code>) \u043f\u043e\u0432\u0435\u0440\u0445\u00a0<code>sqlite3ext.h<\/code>. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434: \u0434\u0435\u0441\u043a\u0442\u043e\u043f, \u0441\u0435\u0440\u0432\u0435\u0440, CI \u2014 \u0438 \u044d\u0442\u043e \u0436\u0435 \u0434\u0451\u0440\u043d\u0435\u0442 \u043d\u0435-.NET \u0445\u043e\u0441\u0442 (Python,\u00a0<code>sqlite3<\/code>\u00a0CLI), \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 redb \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u043e\u0431\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u043e-\u043a\u0440\u0443\u043f\u043d\u043e\u043c\u0443. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0442\u0438\u0432\u043a\u0430 (\u043e\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435), \u043f\u043e\u0442\u043e\u043c \u0434\u0430\u0442\u0430 (\u043e\u043d\u0430 \u0432\u0430\u0436\u043d\u0435\u0435), \u043f\u043e\u0442\u043e\u043c \u0431\u0430\u0433\u0438, \u043f\u043e\u0442\u043e\u043c \u0433\u0440\u0430\u0431\u043b\u0438.<\/p>\n<hr\/>\n<h3>\u0427\u0430\u0441\u0442\u044c 0.5. \u0427\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440:\u00a0objects\u00a0\u0438\u00a0values<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u044b\u0440\u044f\u0442\u044c \u0432 \u043d\u0430\u0442\u0438\u0432\u043a\u0443 \u2014 \u0447\u0442\u043e \u043e\u043d\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442. \u041c\u043e\u0434\u0435\u043b\u044c redb \u2014 \u044d\u0442\u043e ~13 \u0442\u0430\u0431\u043b\u0438\u0446 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u2014 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab13 \u0442\u0430\u0431\u043b\u0438\u0446\u00bb), \u043d\u043e \u0434\u043b\u044f SQLite-\u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u0441\u0443\u0449\u0438\u0445 \u0434\u0432\u0435, \u0438 \u043e\u0431\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043a\u0430-\u0432-\u043a\u043e\u043b\u043e\u043d\u043a\u0443.<\/p>\n<p><code>_objects<\/code>\u00a0\u2014 \u00ab\u0448\u0430\u043f\u043a\u0430\u00bb \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430: \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u0434\u0435\u0440\u0435\u0432\u043e, \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435, \u0434\u0430\u0442\u044b, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0445\u0435\u043c\u0443 (\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0442\u0438\u043f):<\/p>\n<pre><code class=\"sql\">CREATE TABLE _objects(    _id             INTEGER NOT NULL PRIMARY KEY,    _id_parent      INTEGER NULL,            -- \u0434\u0435\u0440\u0435\u0432\u043e (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c)    _id_scheme      INTEGER NOT NULL,        -- RTTI: \u043a\u0430\u043a\u043e\u0433\u043e \u041a\u041b\u0410\u0421\u0421\u0410 \u043e\u0431\u044a\u0435\u043a\u0442    _id_owner       INTEGER NOT NULL,    _id_who_change  INTEGER NOT NULL,    _date_create    REAL    NOT NULL DEFAULT (julianday('now')),  -- UTC Julian day (REAL)    _date_modify    REAL    NOT NULL DEFAULT (julianday('now')),  -- UTC Julian day (REAL)    _name           TEXT    NULL,    _hash           TEXT    NULL,            -- \u0445\u044d\u0448 \u0441\u043e\u0441\u0442\u0430\u0432\u0430 \u043f\u0440\u043e\u043f\u0441\u043e\u0432 (\u0434\u043b\u044f \u0434\u0435\u043b\u044c\u0442\u044b\/\u043a\u044d\u0448\u0430)    -- \u0441\u043b\u043e\u0442\u044b \u0434\u043b\u044f RedbPrimitive&lt;T&gt; (\u043a\u043e\u0433\u0434\u0430 Props \u2014 \u044d\u0442\u043e \u0441\u0430\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432, \u0431\u0435\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b)    _value_long     INTEGER NULL,    _value_string   TEXT    NULL,    _value_bool     INTEGER NULL,            -- bool = 0\/1    _value_double   REAL    NULL,    _value_numeric  REAL    NULL,            -- NUMERIC(38,18): REAL \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e    ...);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>_values<\/code>\u00a0\u2014 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430 (\u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, [\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430]). \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0438\u0434\u0435\u044f \u2014\u00a0<strong>\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438-\u0441\u043b\u043e\u0442\u044b<\/strong>: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u0435\u0436\u0438\u0442 \u043d\u0435 \u0432 \u043e\u0434\u043d\u043e\u0439 \u00ab\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439\u00bb \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435, \u0430 \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"sql\">CREATE TABLE _values(    _id              INTEGER NOT NULL PRIMARY KEY,    _id_structure    INTEGER NOT NULL,       -- RTTI: \u041a\u0410\u041a\u041e\u0415 \u044d\u0442\u043e \u043f\u043e\u043b\u0435    _id_object       INTEGER NOT NULL,    _String          TEXT    NULL,    _Long            INTEGER NULL,    _Guid            TEXT    NULL,    _Double          REAL    NULL,    _DateTimeOffset  REAL    NULL,           -- DateTime\/DateTimeOffset\/DateOnly \u043a\u0430\u043a UTC Julian    _Boolean         INTEGER NULL,           -- 0\/1    _ByteArray       BLOB    NULL,    _Numeric         REAL    NULL,    _ListItem        INTEGER NULL,    _Object          INTEGER NULL,           -- \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442    _array_parent_id INTEGER NULL,           -- \u043c\u0430\u0441\u0441\u0438\u0432\u044b\/\u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u2014 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e    _array_index     INTEGER NULL);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0432\u0430 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435:<\/p>\n<ul>\n<li>\n<p><strong>\u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0442\u044b, \u0430 \u043d\u0435 \u00ab\u0432\u0441\u0451 \u0441\u0442\u0440\u043e\u043a\u043e\u0439\u00bb.<\/strong>\u00a0<code><em>Boolean<\/em><\/code><em>\u00a0\u2014 \u044d\u0442\u043e\u00a0<\/em><code><em>0\/1<\/em><\/code><em>,\u00a0<\/em><code>DateTimeOffset<\/code>\u00a0\u2014 REAL Julian,\u00a0<code><em>Long<\/em><\/code><em>\u00a0\u2014 \u0446\u0435\u043b\u043e\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 SQL \u0438\u0434\u0443\u0442 \u043f\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 (\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f), \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043a\u0430\u0441\u0442. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u043d\u0435 EAV\u00bb:\u00a0<\/em><code>values<\/code>\u00a0\u2014 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 props-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0430\u00a0<code><em>id<\/em>structure<\/code>\u00a0\u2192\u00a0<code>_structures<\/code>\u00a0\u043d\u0435\u0441\u0451\u0442 RTTI \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u043e\u0435 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0438 \u043a\u0430\u043a\u043e\u0433\u043e \u043e\u043d\u043e \u0442\u0438\u043f\u0430. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0442\u0438\u043f \u043f\u043e\u043b\u044f \u2014 \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043a\u0443-\u0441\u043b\u043e\u0442 \u0434\u043b\u044f\u00a0<code>MAX(...) FILTER<\/code>\u00a0\u0432 \u043f\u0438\u0432\u043e\u0442\u0435; \u0431\u0435\u0437 RTTI \u043e\u043d \u0431\u044b \u043d\u0435 \u0437\u043d\u0430\u043b, \u0438\u0437 \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u00a0<code>LastName<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u2014 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e<\/strong>, \u0447\u0435\u0440\u0435\u0437\u00a0<code><em>array<\/em>parent_id<\/code>\/<code>_array_index<\/code>, \u0430 \u043d\u0435 JSON-\u0431\u043b\u043e\u0431\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0445\u00a0<code>GROUP BY<\/code>-\u043e\u043c \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, \u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0443\u043c\u0435\u0435\u0442 \u043f\u043e \u043d\u0438\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c (<code>_array_index IS NULL<\/code>\u00a0\u0432 \u043f\u0438\u0432\u043e\u0442\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u043b\u044f \u043e\u0442 \u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432).<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u00ab\u0434\u0432\u0438\u0436\u043e\u043a \u0432 \u0431\u0430\u0437\u0435\u00bb = \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0438\u0442\u0430\u044e\u0442\/\u043f\u0438\u0448\u0443\u0442 \u0440\u043e\u0432\u043d\u043e \u044d\u0442\u0438 \u0434\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0441\u0432\u0435\u0440\u044f\u044f\u0441\u044c \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u00a0<code><em>schemes<\/em><\/code><em>\/<\/em><code>structures<\/code>.<\/p>\n<hr\/>\n<h3>\u0427\u0430\u0441\u0442\u044c 1. \u041d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435: \u0430\u043d\u0430\u0442\u043e\u043c\u0438\u044f<\/h3>\n<h4>\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430<\/h4>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 SQLite \u2014 \u044d\u0442\u043e\u00a0<code>.so<\/code>\/<code>.dll<\/code>\/<code>.dylib<\/code>\u00a0\u0441 \u043e\u0434\u043d\u043e\u0439 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439-\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c. \u0418\u043c\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437 basename \u0444\u0430\u0439\u043b\u0430: \u0434\u043b\u044f\u00a0<code>redb.dll<\/code>\u00a0\u044d\u0442\u043e\u00a0<code>sqlite3_redb_init<\/code>. \u0412\u043d\u0443\u0442\u0440\u0438 \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 SQL-\u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code>SQLITE_EXTENSION_INIT1int sqlite3_redb_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi){  SQLITE_EXTENSION_INIT2(pApi);  int rc;  rc = sqlite3_create_function(db, \"get_object_json\", 1, SQLITE_UTF8, 0,                               getObjectJsonFunc, 0, 0);  if(rc != SQLITE_OK) return rc;  rc = sqlite3_create_function(db, \"get_object_json\", 2, SQLITE_UTF8, 0,                               getObjectJsonFunc, 0, 0);   \/\/ overload: (_id, max_depth)  if(rc != SQLITE_OK) return rc;  rc = sqlite3_create_function(db, \"save_object_json\", 1, SQLITE_UTF8, 0,                               saveObjectJsonFunc, 0, 0);  if(rc != SQLITE_OK) return rc;  rc = redbRegisterPvt(db);   \/\/ \u0432\u0435\u0441\u044c pvt_*-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440  return rc;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>SQLITE_EXTENSION_INIT1<\/code>\u00a0\/\u00a0<code>INIT2<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0438\u0437\u00a0<code>sqlite3ext.h<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044e\u0442 \u043f\u0440\u044f\u043c\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b\u00a0<code>sqlite3_*<\/code>\u00a0\u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u044b \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\u00a0<code>pApi<\/code>. \u041d\u044e\u0430\u043d\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u0433\u043b\u044f\u0434\u0435\u0442\u044c: \u043f\u043e\u0441\u043b\u0435\u00a0<code>INIT2<\/code>\u00a0<strong>\u0432\u0441\u0451<\/strong>\u00a0API SQLite \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0417\u0430\u0431\u044b\u043b\u0438\u00a0<code>INIT2<\/code>\u00a0\u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u00a0<code>sqlite3_*<\/code>\u00a0\u0441 \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<h4>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u2014 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442<\/h4>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439: \u043e\u043d\u0438\u00a0<strong>\u043d\u0435 \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b<\/strong>. SQLite \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438 \u043d\u043e\u0432\u043e\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438. \u0410\u00a0<a href=\"http:\/\/Microsoft.Data\" rel=\"noopener noreferrer nofollow\"><code>Microsoft.Data<\/code><\/a><code>.Sqlite<\/code>\u00a0\u043f\u0443\u043b\u0438\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0417\u043d\u0430\u0447\u0438\u0442 \u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430\u0434\u043e\u00a0<strong>\u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439<\/strong>\u00a0\u043a\u043e\u043d\u043d\u0435\u043a\u0442, \u043f\u043e\u0441\u043b\u0435 PRAGMA. \u0423 \u043d\u0430\u0441 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434\u00a0<code>SqliteConnection<\/code>: \u043e\u0442\u043a\u0440\u044b\u043b\u0438 \u2192 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043b\u0438\u00a0<code>foreign_keys=ON<\/code>\u00a0\u0438\u00a0<code>busy_timeout<\/code>\u00a0\u2192 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u2192 \u043e\u0442\u0434\u0430\u043b\u0438 \u0432 \u043f\u0443\u043b.<\/p>\n<p>\u041f\u0443\u0442\u044c \u043a \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0443 \u0438\u0449\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<ol>\n<li>\n<p>\u042f\u0432\u043d\u044b\u0439\u00a0<code>SqliteDataSource.NativeExtensionPath<\/code>\u00a0(\u0435\u0441\u043b\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043a\u043e\u0434\u0435).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u00a0<code>REDB_SQLITE_EXTENSION<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0430\u0447\u0435 \u2014\u00a0<code>redb.{dll,so,dylib}<\/code>\u00a0\u0438\u0437\u00a0<code>runtimes\/&lt;rid&gt;\/native\/<\/code>\u00a0NuGet-\u043f\u0430\u043a\u0435\u0442\u0430; \u0432 \u0434\u0435\u0432\u0435 \u2014 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u043c \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0434\u043e\u00a0<code>redb.SQLite\/native\/build<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>Pro \u043f\u0443\u0442\u044c \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u043e\u043e\u0431\u0449\u0435: \u0435\u043c\u0443 \u043d\u0430\u0442\u0438\u0432\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u0438 \u0432 WASM\/\u043c\u043e\u0431\u0438\u043b\u043a\u0435 \u0435\u0451 \u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b.<\/p>\n<h4>\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430: \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0430\u0440\u043e\u043c<\/h4>\n<p>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u2014 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0438 \u0443 \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0431\u043e\u043d\u0443\u0441: \u043e\u043d\u043e \u043d\u0435 \u043b\u0438\u043d\u043a\u0443\u0435\u0442\u0441\u044f\u00a0<strong>\u043d\u0438 \u0441 \u0447\u0435\u043c<\/strong>.\u00a0<code>sqlite3ext.h<\/code>\u00a0\u043e\u0442\u0434\u0430\u0451\u0442 API \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u0443 \u0445\u043e\u0441\u0442\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u044d\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442\u00a0<code>SQLITE_EXTENSION_INIT2<\/code>) \u2014 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0435\u0442 \u043d\u0438\u00a0<code>libsqlite3<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u0438\u0441\u043a\u0430\u0442\u044c, \u043d\u0438 import-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u0438 target-sysroot. \u041a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u00ab\u0443\u043a\u0430\u0436\u0438 CMake \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u00bb:<\/p>\n<pre><code># linux-arm64 \u0441 x64-\u043c\u0430\u0448\u0438\u043d\u044b, \u0432 \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u2014 sysroot \u043d\u0435 \u043d\u0443\u0436\u0435\u043ddocker run --rm -v \"$PWD:\/work\" debian:bookworm bash -c '  apt-get update &amp;&amp; apt-get install -y cmake make gcc-aarch64-linux-gnu  cd \/work\/redb.SQLite\/native  cmake -S . -B build-linux-arm64 -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc  cmake --build build-linux-arm64'# \u2192 build-linux-arm64\/redb.so: ELF 64-bit LSB shared object, ARM aarch64<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f\u00a0<em>\u043b\u0438\u043d\u043a\u0443\u0435\u0442\u0441\u044f<\/em>\u00a0\u0441 libsqlite3, \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0431\u044b arm64-\u0431\u0438\u043b\u0434 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438; \u044d\u0442\u043e\u0439 \u2014 \u043d\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u0434\u0451\u0440\u0433\u0430\u0435\u0442 SQLite \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0445\u043e\u0441\u0442\u0430. \u041e\u0434\u0438\u043d \u043a\u0440\u043e\u0441\u0441-gcc \u2014 \u043e\u0434\u0438\u043d \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 arm64-\u0431\u0438\u043d\u0430\u0440\u044c.<\/p>\n<p>\u0423 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0432\u043e\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442. SQLite \u0433\u0440\u0443\u0437\u0438\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u00a0<strong>\u044f\u0432\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438<\/strong>\u00a0(<code>conn.LoadExtension(...)<\/code>), \u0430 \u043d\u0435 \u043a\u0430\u043a P\/Invoke-\u043d\u0430\u0442\u0438\u0432\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0445\u043e\u0441\u0442 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442 \u0438\u0437 NuGet-\u043a\u0435\u0448\u0430 \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 output \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. RID-\u0442\u0430\u0440\u0433\u0435\u0442\u00a0<code>dotnet publish -r &lt;rid&gt;<\/code>\u00a0\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u00a0<code>runtimes\/&lt;rid&gt;\/native\/<\/code>\u00a0\u0437\u0430 \u0432\u0430\u0441; framework-dependent \u0441\u0431\u043e\u0440\u043a\u0430 (\u0431\u0435\u0437 RID) \u2014 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0430\u043a\u0435\u0442 \u0432\u0435\u0437\u0451\u0442\u00a0<code>buildTransitive<\/code>\u00a0.targets, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u043e\u0434 \u041e\u0421 \u0431\u0438\u043d\u0430\u0440\u044c \u0432 output \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f, \u0441 \u0433\u0435\u0439\u0442\u043e\u043c \u043f\u043e\u00a0<code>Exists<\/code>\u00a0\u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 RID. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u00ab\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443\u00bb = \u00ab\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d\u00a0<code>redb.{so,dylib}<\/code>\u00a0\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u00a0<code>native\/build-&lt;rid&gt;\/<\/code>\u00bb \u2014 csproj \u0438 .targets \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442 \u0432\u0441\u0435 \u043f\u044f\u0442\u044c RID.<\/p>\n<h4>War story #5: \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439\u00a0.targets, \u0447\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439 (3.2.0 \u2192 3.2.1)<\/h4>\n<p>\u0418 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043e\u0447\u043d\u044b\u0439\u00a0<code>.targets<\/code>\u00a0\u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043b\u0438\u0437\u0435 \u043f\u0443\u0441\u0442\u0438\u043b \u043a\u0440\u043e\u0432\u044c \u2014 \u0430 \u0440\u0430\u0437 \u0443 \u043d\u0430\u0441 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440, \u0432\u043e\u0442 \u043e\u043d. \u041c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438\u00a0<strong>3.2.1<\/strong>\u00a0\u0441 \u0431\u0430\u043d\u043d\u0435\u0440-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c \u0432\u00a0<code>redb.SQLite.targets<\/code>, \u0433\u0434\u0435 \u0432\u043d\u0443\u0442\u0440\u0438\u00a0<code>&lt;!-- \u2026 --&gt;<\/code>\u00a0\u0441\u0442\u043e\u044f\u043b\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u0437 \u0434\u0435\u0444\u0438\u0441\u043e\u0432. XML-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u00a0<code>--<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 MSBuild \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0434\u0430\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b: \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c, \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0432\u0448\u0438\u0439 \u043f\u0430\u043a\u0435\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u043b<\/p>\n<pre><code>error MSB4024: An XML comment cannot contain '--', and '-' cannot be the last character.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0438 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435. \u0418 \u044d\u0442\u043e \u0435\u0445\u0430\u043b\u043e \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e \u2014\u00a0<a href=\"http:\/\/redb.SQLite.Pro\" rel=\"noopener noreferrer nofollow\"><code>redb.SQLite.Pro<\/code><\/a>\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0<code>redb.SQLite<\/code>, \u0430\u00a0<code>buildTransitive<\/code>-\u0430\u0441\u0441\u0435\u0442\u044b \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c, \u0442\u0430\u043a \u0447\u0442\u043e Pro-\u043f\u0430\u043a\u0435\u0442 \u0431\u044b\u043b \u0441\u043b\u043e\u043c\u0430\u043d \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 200\/200 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0435 \u043f\u043e\u0439\u043c\u0430\u043b\u0438? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0<code><strong>buildTransitive<\/strong><\/code><strong>\u00a0\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u0430\u043a\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044e\u0442 \u043a\u0430\u043a NuGet-\u043f\u0430\u043a\u0435\u0442.<\/strong>\u00a0\u041d\u0430\u0448\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0447\u0435\u0440\u0435\u0437\u00a0<code>ProjectReference<\/code>, \u0430 \u043e\u043d \u0438\u043c\u043f\u043e\u0440\u0442\u00a0<code>build\/<\/code>\u00a0\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0438\u0442\u044b\u0439 \u0444\u0430\u0439\u043b \u043b\u0435\u0436\u0430\u043b \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0435\u043b\u0451\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439\u00a0<code>dotnet add package redb.SQLite<\/code>. \u041c\u044b \u043d\u0430\u0448\u043b\u0438 \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u00a0<em>\u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e<\/em>\u00a0\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f (\u0441\u044d\u043c\u043f\u043b \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u0440\u0435\u043f\u043e), \u043d\u0438 \u0441\u0435\u043a\u0443\u043d\u0434\u043e\u0439 \u0440\u0430\u043d\u044c\u0448\u0435.<\/p>\n<p>\u0424\u0438\u043a\u0441 \u2014 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\u0438 \u0434\u0430 \u2014 \u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0451\u043b \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u0431\u0430\u0433 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 csproj,\u00a0<em>\u043f\u043e\u043a\u0430 \u043f\u0438\u0441\u0430\u043b \u0444\u0438\u043a\u0441<\/em>;\u00a0<code>--<\/code>\u00a0\u2014 \u0443\u043f\u0440\u044f\u043c\u0430\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043c\u0438\u043d\u0430). \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0435\u043b\u044c\u0437\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0443\u0448\u043b\u0438 \u043a\u0430\u043a\u00a0<code><strong>redb.SQLite<\/strong><\/code><strong>\u00a0\/\u00a0<\/strong><a href=\"http:\/\/redb.SQLite.Pro\" rel=\"noopener noreferrer nofollow\"><code><strong>redb.SQLite.Pro<\/strong><\/code><\/a><strong>\u00a03.2.1<\/strong>, \u0430 \u0431\u0438\u0442\u0430\u044f \u043f\u0430\u0440\u0430\u00a0<strong>3.2.1<\/strong>\u00a0\u2014 unlisted. \u0422\u0430\u043a \u0447\u0442\u043e \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438: \u0434\u0432\u0438\u0436\u043e\u043a, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0430\u0442\u0430\u043c\u0438, \u0431\u0430\u0433\u0438 \u0432\u044b\u0448\u0435 \u2014 \u0432\u0441\u0451\u00a0<strong>3.2.1<\/strong>; \u0434\u0432\u0430 SQLite-NuGet-\u043f\u0430\u043a\u0435\u0442\u0430 \u2014\u00a0<strong>3.2.1<\/strong>. \u041d\u0435\u043f\u0440\u0438\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u0443\u0440\u043e\u043a:\u00a0<code>build\/<\/code>\u00a0\u0438\u00a0<code>buildTransitive<\/code>\u00a0\u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043e\u0442\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 \u043a\u043e\u0434, \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043e \u0438\u0437\u00a0<em>\u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e<\/em>\u00a0\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f \u0432 CI, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0<code>ProjectReference<\/code>\u00a0\u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u0432\u0430\u043c \u0441\u043e\u0432\u0440\u0451\u0442.<\/p>\n<h4>\u0427\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438: \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440<\/h4>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u0432\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p><code><strong>get_object_json(_id [, max_depth])<\/strong><\/code>\u00a0\u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440. \u0411\u0435\u0440\u0451\u0442\u00a0<code><em>id<\/em><\/code><em>, \u0447\u0438\u0442\u0430\u0435\u0442\u00a0<\/em><code>values<\/code>, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 JSON-\u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u043b\u044c\u0448\u0435 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 System.Text.Json \u0432 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439\u00a0<code>RedbObject&lt;TProps&gt;<\/code>. \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0451: base-\u043f\u043e\u043b\u044f \u0438\u0437\u00a0<code><em>objects<\/em><\/code><em>, \u0441\u043a\u0430\u043b\u044f\u0440\u044b, \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u0438 (\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e, \u0447\u0435\u0440\u0435\u0437\u00a0<\/em><code>array_index<\/code>\u00a0\/\u00a0<code><em>array<\/em>parent_id<\/code>), \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435\u00a0<code>Class<\/code>-\u043f\u043e\u043b\u044f, \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b,\u00a0<code>ListItem<\/code>\u00a0(\u0432\u043a\u043b\u044e\u0447\u0430\u044f\u00a0<code>ListItem<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u043d\u0435\u0441\u0451\u0442\u00a0<code>Object<\/code>). \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u043d\u0443\u0436\u043d\u0430 RTTI: \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0443 \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0445\u0435\u043c\u0443, \u0442\u0438\u043f\u044b \u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0439 \u0438 \u0442\u043e, \u0447\u0442\u043e \u0432\u043e\u0442 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u2014 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u0432\u043e\u043d \u0442\u043e \u2014 \u0441\u0441\u044b\u043b\u043a\u0430. \u0411\u0435\u0437 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0443\u0447\u0430 \u0441\u0442\u0440\u043e\u043a \u0432\u00a0<code>_values<\/code>.<\/p>\n<p><code><strong>pvt_*<\/strong><\/code><strong>-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440<\/strong>\u00a0\u2014 \u043f\u043e\u0440\u0442 ~9 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a PL\/pgSQL-\u043b\u043e\u0433\u0438\u043a\u0438 \u0432 C \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 SQL-\u0441\u0442\u0440\u043e\u043a:\u00a0<code>pvt_build_query_sql<\/code>,\u00a0<code>pvt_build_aggregate_sql<\/code>,\u00a0<code>pvt_build_groupby_sql<\/code>,\u00a0<code>pvt_build_window_sql<\/code>,\u00a0<code>pvt_build_projection_sql<\/code>,\u00a0<code>pvt_build_array_groupby_sql<\/code>. \u041a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code>LINQ-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435   \u2192 (C#) \u0444\u0430\u0441\u0435\u0442-\u0444\u0438\u043b\u044c\u0442\u0440 \u0432 JSON + \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439   \u2192 (\u043d\u0430\u0442\u0438\u0432\u043a\u0430) pvt_build_query_sql(scheme, filterJson, ...)   \u2192 \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 SQL-SELECT   \u2192 (C#) \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 get_object_json<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043a\u0430 \u2014 \u044d\u0442\u043e\u00a0<strong>\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0442\u043e\u0440 \u0444\u0438\u043b\u044c\u0442\u0440-JSON \u0432 SQL<\/strong>. C# \u043d\u0435 \u0441\u0442\u0440\u043e\u0438\u0442 SQL \u0441\u0430\u043c (\u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0431\u044b Pro), \u043e\u043d \u0441\u0442\u0440\u043e\u0438\u0442 \u0444\u0438\u043b\u044c\u0442\u0440-JSON \u0438 \u043f\u0440\u043e\u0441\u0438\u0442 \u0431\u0430\u0437\u0443 \u0441\u043e\u0431\u0440\u0430\u0442\u044c SQL. \u0417\u0432\u0443\u0447\u0438\u0442 \u043d\u0430\u0438\u0437\u043d\u0430\u043d\u043a\u0443, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043f\u0430\u0440\u0438\u0442\u0435\u0442: \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0444\u0438\u043b\u044c\u0442\u0440-JSON \u0438 \u043d\u0430 Postgres, \u0438 \u043d\u0430 SQLite Free \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 SQL \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0430\u0445.<\/p>\n<h4>\u0427\u0443\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435 \u043f\u0440\u043e\u00a0get_object_json: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f, \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0441\u0441\u044b\u043b\u043a\u0438<\/h4>\n<p>\u00ab\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442 JSON\u00bb \u0437\u0432\u0443\u0447\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0448\u044c, \u0447\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0433\u0440\u0430\u0444. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u0445\u0435\u043c\u044b \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0440\u0435\u0448\u0430\u0435\u0442,\u00a0<strong>\u0447\u0442\u043e \u044d\u0442\u043e<\/strong>, \u043f\u043e RTTI \u0438\u0437\u00a0<code>_structures<\/code>:<\/p>\n<ul>\n<li>\n<p><strong>\u0441\u043a\u0430\u043b\u044f\u0440<\/strong>\u00a0\u2014 \u0431\u0435\u0440\u0451\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438-\u0441\u043b\u043e\u0442\u0430\u00a0<code>_values<\/code>\u00a0(\u0434\u043b\u044f \u0434\u0430\u0442\u044b \u2014 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u00a0<code>strftime<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0440\u0443\u0436\u0443 \u0443\u0448\u043b\u0430 ISO-\u0441\u0442\u0440\u043e\u043a\u0430);<\/p>\n<\/li>\n<li>\n<p><strong>\u043c\u0430\u0441\u0441\u0438\u0432\/\u0441\u043b\u043e\u0432\u0430\u0440\u044c<\/strong>\u00a0\u2014 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0442\u0435\u043c \u0436\u0435\u00a0<code><em>array<\/em>parent_id<\/code>, \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u044f \u043f\u043e\u00a0<code><em>array<\/em>index<\/code>, \u0432 JSON-\u043c\u0430\u0441\u0441\u0438\u0432\/\u043e\u0431\u044a\u0435\u043a\u0442 (\u0432\u043e\u0442 \u0437\u0430\u0447\u0435\u043c \u0432 \u043f\u0438\u0432\u043e\u0442\u0435\u00a0<code><em>array<\/em>index IS NULL<\/code>\u00a0\u2014 \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u00ab\u0441\u043a\u0430\u043b\u044f\u0440\u043d\u0443\u044e\u00bb \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u043b\u044f \u043e\u0442 \u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432);<\/p>\n<\/li>\n<li>\n<p><strong>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439\u00a0<\/strong><code><strong>Class<\/strong><\/code>\u00a0\u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0437\u043e\u0432\u0451\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430;<\/p>\n<\/li>\n<li>\n<p><strong>\u0441\u0441\u044b\u043b\u043a\u0430 (<\/strong><code><strong>_Object<\/strong><\/code><strong>)<\/strong>\u00a0\u2014 \u043f\u043e\u00a0<code>max_depth<\/code>\u00a0\u043b\u0438\u0431\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0441 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435\u043c \u0433\u043b\u0443\u0431\u0438\u043d\u044b), \u043b\u0438\u0431\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 id-\u0441\u0441\u044b\u043b\u043a\u0443;<\/p>\n<\/li>\n<li>\n<p><code><strong>ListItem<\/strong><\/code>\u00a0\u2014 \u043f\u0443\u043d\u043a\u0442 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430; \u043f\u0440\u0438\u0447\u0451\u043c\u00a0<code>ListItem<\/code>\u00a0\u0441\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u0441\u0442\u0438\u00a0<code>Object<\/code>, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u00a0<code>max_depth<\/code>\u00a0(\u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438) \u2014 \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c \u043e\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043d\u0430 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0441\u044b\u043b\u043a\u0430\u0445 \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0442\u0430\u0449\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043e\u0434\u0438\u043d JSON. \u0411\u0435\u0437 RTTI \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d: \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043e\u0431\u044f\u0437\u0430\u043d\u00a0<em>\u0437\u043d\u0430\u0442\u044c<\/em>, \u0447\u0442\u043e \u0432\u043e\u0442 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u2014 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u0432\u043e\u0442 \u044d\u0442\u043e \u2014 \u0441\u0441\u044b\u043b\u043a\u0430, \u0438\u043d\u0430\u0447\u0435 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438\u00a0<code>_values<\/code>\u00a0\u0431\u0435\u0437 \u0441\u043c\u044b\u0441\u043b\u0430.<\/p>\n<h4>\u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430:\u00a0save_object_json\u00a0\u2014 \u043f\u0443\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438<\/h4>\n<p>\u0423 \u0447\u0442\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u0431\u043b\u0438\u0437\u043d\u0435\u0446 \u2014\u00a0<code>save_object_json(json)<\/code>. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 JSON \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u00a0<code><em>objects<\/em><\/code><em>\u00a0(base) \u0438\u00a0<\/em><code>values<\/code>\u00a0(props). \u0414\u0432\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f SQLite:<\/p>\n<ul>\n<li>\n<p><strong>\u0414\u0430\u0442\u044b \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c.<\/strong>\u00a0\u0412 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0435\u043c JSON \u0434\u0430\u0442\u044b \u2014 ISO-\u0441\u0442\u0440\u043e\u043a\u0438 (\u0442\u0430\u043a \u0438\u0445 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 System.Text.Json \u0438\u0437\u00a0<code>DateTimeOffset<\/code>). \u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432\u00a0<code>julianday('&lt;iso&gt;')<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u00a0<code><em>DateTimeOffset<\/em><\/code><em>\u00a0\u043b\u0451\u0433 REAL Julian. \u042d\u0442\u043e \u0437\u0435\u0440\u043a\u0430\u043b\u043e read-side\u00a0<\/em><code><em>strftime<\/em><\/code><em>\u00a0\u2014 \u0438 \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0447\u0438\u043d\u0438\u043b\u043e\u0441\u044c \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043b\u0438\u0437\u0435 \u043f\u043e\u0434 \u00absave<\/em>object_json \u0442\u043e\u0436\u0435 \u043f\u0440\u0430\u0432\u044c\u00bb: \u0434\u043e \u0444\u0438\u043a\u0441\u0430 \u0434\u0430\u0442\u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0445\u043e\u0434\u0438\u043b\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0438 \u043d\u0435 \u0441\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0441 REAL-\u043a\u043e\u043b\u043e\u043d\u043a\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043f\u0441\u043e\u0432.<\/strong>\u00a0\u041d\u0430 Free \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442\u00a0<code>PropsSaveStrategy.DeleteInsert<\/code>: \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 = \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\u00a0<code><em>values<\/em><\/code><em>\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 (ChangeTracking \u2014 \u0434\u0435\u043b\u044c\u0442\u0430 \u043f\u043e\u00a0<\/em><code>hash<\/code>\u00a0\u2014 \u044d\u0442\u043e Pro-\u0444\u0438\u0447\u0430). \u041f\u0440\u043e\u0441\u0442\u043e, \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e, \u0431\u0435\u0437 \u0441\u043b\u0435\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043b\u043e\u044f \u2014 \u0437\u0430 \u0441\u0447\u0451\u0442 \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0435\u0439; \u0434\u043b\u044f embedded-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f: CLR-\u0440\u0435\u0435\u0441\u0442\u0440 \u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c<\/h4>\n<p><code>get_object_json<\/code>\u00a0\u043e\u0442\u0434\u0430\u0451\u0442 JSON \u2014 \u043d\u043e \u0432\u043e\u00a0<strong>\u0447\u0442\u043e<\/strong>\u00a0\u0435\u0433\u043e \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c? \u0414\u043b\u044f\u00a0<code>LoadAsync&lt;EmployeeProps&gt;(id)<\/code>\u00a0\u043e\u0442\u0432\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0438\u0437 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0430. \u0410 \u0434\u043b\u044f\u00a0<strong>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0439<\/strong>\u00a0\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (<code>GetChildren<\/code>\u00a0\u0434\u0435\u0440\u0435\u0432\u0430, \u0433\u0434\u0435 \u0434\u0435\u0442\u0438 \u2014 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0445\u0435\u043c;\u00a0<code>LoadDynamicObject<\/code>) \u0442\u0438\u043f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d: \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u00a0<code><em>id<\/em>scheme<\/code>\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u043d\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u0439\u00a0<code>*Props<\/code>-\u043a\u043b\u0430\u0441\u0441 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u042d\u0442\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u0446\u0438\u043a\u043b\u0435 \u0432 \u0434\u0432\u0443\u0445\u0441\u043b\u043e\u0439\u043d\u044b\u0439 CLR-\u0440\u0435\u0435\u0441\u0442\u0440 (\u0447\u0438\u043d\u0438\u043b\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u0443\u044e\u00a0<code>LoadAsync<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043e\u0442\u0434\u0430\u0432\u0430\u043b\u0430 \u043d\u0435 \u0442\u043e\u0442 \u0442\u0438\u043f):<\/p>\n<ul>\n<li>\n<p><strong>\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00a0<\/strong><code><strong>\u0438\u043c\u044f \u0441\u0445\u0435\u043c\u044b \u2194 Type<\/strong><\/code>\u00a0\u2014 \u0441\u0430\u043c\u043e\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f: \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0430\u00a0<code>AppDomain.AssemblyLoad<\/code>, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438\u00a0<code>*Props<\/code>\u00a0\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u00ab\u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435\u00bb \u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0435\u043d\u0438\u0432\u043e (\u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u00ab\u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435\u00bb);<\/p>\n<\/li>\n<li>\n<p><strong>\u043f\u0435\u0440-\u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u044d\u0448\u00a0<\/strong><code><strong>scheme_id \u2192 Type<\/strong><\/code>\u00a0\u2014 \u0433\u0434\u0435 \u00ab\u0434\u043e\u043c\u0435\u043d\u00bb =\u00a0<code>SHA256(sanitized connection string)<\/code>\u00a0\u0438\u043b\u0438 \u044f\u0432\u043d\u044b\u0439\u00a0<code>CacheDomain<\/code>. \u041f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0434\u043e\u043c\u0435\u043d\u0443 \u043d\u0443\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437 (\u0432 \u0442.\u0447. \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e SQLite-\u0444\u0430\u0439\u043b\u043e\u0432), \u0438\u00a0<code>scheme_id=1000010<\/code>\u00a0\u0432 \u043e\u0434\u043d\u043e\u0439 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441, \u0447\u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a SQLite \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e: \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043e\u0442\u0434\u0430\u0451\u0442 JSON +\u00a0<code><em>id<\/em>scheme<\/code>, \u0430 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0<code><em>id<\/em>scheme<\/code>\u00a0\u0432\u00a0<code>Type<\/code>\u00a0\u0434\u043b\u044f \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043c\u043a\u0430. \u041e\u0448\u0438\u0431\u0438\u0441\u044c \u0437\u0434\u0435\u0441\u044c \u2014 \u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 \u0434\u0435\u0442\u0435\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d (\u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439) \u0442\u0438\u043f.<\/p>\n<h4>\u0421\u043b\u043e\u0432\u0430\u0440\u044c Postgres \u2192 SQLite<\/h4>\n<p>\u041f\u043e\u0440\u0442 \u2014 \u044d\u0442\u043e \u043d\u0435 \u00ab\u043f\u0435\u0440\u0435\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u043d\u0430 C\u00bb, \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0430. \u0421\u0430\u043c\u044b\u0435 \u0447\u0430\u0441\u0442\u044b\u0435 \u0437\u0430\u043c\u0435\u043d\u044b (\u0432\u0441\u0451 \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437\u00a0<code>SqliteDialect<\/code>\/\u043d\u0430\u0442\u0438\u0432\u043a\u0438):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">Postgres<\/p>\n<\/th>\n<th>\n<p align=\"left\">SQLite<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0433\u0434\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>array_agg(x) FILTER (WHERE \u2026)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>json_group_array(x) FILTER (WHERE \u2026)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432 \u043f\u0438\u0432\u043e\u0442\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>x = ANY($1)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>x IN (SELECT value FROM json_each($1))<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">IN-\u0441\u043f\u0438\u0441\u043a\u0438 (SQLite \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u044b-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>EXTRACT(year FROM x)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>CAST(strftime('%Y', x) AS INTEGER)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u0430\u0442\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>col ILIKE $1<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>col LIKE $1 ESCAPE '\\'<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 LIKE<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>DELETE \u2026 WHERE _id = ANY($1)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>DELETE \u2026 WHERE <em>id IN (SELECT value FROM json<\/em>each($1))<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 id<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>DISTINCT ON (col)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ROW_NUMBER() OVER (PARTITION BY col)<\/code>\u00a0+\u00a0<code>WHERE rn=1<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">DistinctBy (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0440\u043e\u00a0<code>ESCAPE '\\'<\/code>\u00a0\u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u0438\u043d\u0430. PG \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u00a0<code>\\<\/code>\u00a0\u043a\u0430\u043a escape-\u0441\u0438\u043c\u0432\u043e\u043b \u0432\u00a0<code>LIKE<\/code>. SQLite (\u0438 MSSQL) \u2014\u00a0<strong>\u043d\u0435\u0442<\/strong>. \u0410\u00a0<code>UserProviderBase<\/code>\u00a0\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0432\u0432\u043e\u0434 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c \u0441\u043b\u0435\u0448\u0435\u043c (<code>50%<\/code>\u00a0\u2192\u00a0<code>50\\%<\/code>), \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043d\u0430 PG-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443. \u0415\u0441\u043b\u0438 \u043d\u0430 SQLite \u043d\u0435 \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c\u00a0<code>ESCAPE '\\'<\/code>, \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439\u00a0<code>\\%<\/code>\u00a0\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043c\u0430\u0442\u0447\u0438\u0442\u044c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u044d\u043a\u0441\u043b\u0435\u0448 + \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u2014 \u0442\u0438\u0445\u0430\u044f \u043f\u043e\u0440\u0447\u0430 \u043f\u043e\u0438\u0441\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 SQLite-\u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0435\u00a0<code>LIKE<\/code>\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0434\u0451\u0442 \u0441 \u044f\u0432\u043d\u044b\u043c\u00a0<code>ESCAPE '\\'<\/code>. \u041c\u0435\u043b\u043e\u0447\u044c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043f\u043e\u043b\u0434\u043d\u044f.<\/p>\n<h4>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0438 \u043f\u043e\u0447\u0435\u043c\u0443<\/h4>\n<p><strong>SQLite 3.44.0+<\/strong>\u00a0(\u043d\u043e\u044f\u0431\u0440\u044c 2023). \u041c\u044b \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u043f\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u00a0<code>FILTER (WHERE \u2026)<\/code>, \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438,\u00a0<code>RETURNING<\/code>, JSON1 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 CTE. \u0426\u0435\u043b\u044c \u2014 \u0447\u0442\u043e\u0431\u044b SQLite-SQL \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f\u00a0<strong>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e \u0431\u043b\u0438\u0437\u043e\u043a<\/strong>\u00a0\u043a Postgres-SQL, \u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0441 \u043d\u0443\u043b\u044f. \u0427\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u044b, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0435\u0441\u0442, \u0433\u0434\u0435 \u043e\u043d\u0438 \u0440\u0430\u0437\u044a\u0435\u0437\u0436\u0430\u044e\u0442\u0441\u044f \u0432\u00a0<em>\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438<\/em>\u00a0(\u0430 \u043d\u0435 \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435) \u2014 \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043b\u043e\u0432\u044f\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0434\u0435, \u0430 \u043d\u0435 \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0435.<\/p>\n<h4>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b: AUTOINCREMENT \u0432\u043c\u0435\u0441\u0442\u043e sequences<\/h4>\n<p>\u0412 SQLite \u043d\u0435\u0442 sequences. \u0410 redb \u043d\u0443\u0436\u043d\u044b \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e-\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 id, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 .NET-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u0438 \u043d\u0430\u0442\u0438\u0432\u043a\u0430 (\u0434\u043b\u044f \u043d\u0435-.NET \u0445\u043e\u0441\u0442\u043e\u0432). \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f\u00a0<code>AUTOINCREMENT<\/code>-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u00a0<code>sqlite_sequence<\/code>\u00a0\u043a\u0430\u043a \u043e\u0431\u0449\u0438\u0439 high-water mark. \u0418 C-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435, \u0438 C#-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043b\u044e\u0447\u0435\u0439\u00a0<strong>\u0434\u0432\u0438\u0433\u0430\u044e\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435<\/strong>\u00a0\u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u044e\u0442 \u0431\u043b\u043e\u043a\u0438 id \u0438\u0437 \u043d\u0435\u0433\u043e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 id \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u0438\u0445 \u0440\u0430\u0437\u0434\u0430\u043b \u2014 .NET \u0438\u043b\u0438 Python, \u043f\u0438\u0448\u0443\u0449\u0438\u0435 \u0432 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b.<\/p>\n<h4>\u0411\u043e\u0435\u0432\u0430\u044f \u0431\u0430\u0439\u043a\u0430 \u21161:\u00a0%%\u00a0\u0432\u00a0sqlite3_mprintf<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u00ab\u043f\u043e\u0440\u0442 PL\/pgSQL \u043d\u0430 C\u00bb \u043d\u0435 \u0437\u0432\u0443\u0447\u0430\u043b \u0441\u0442\u0435\u0440\u0438\u043b\u044c\u043d\u043e \u2014 \u0432\u043e\u0442 \u0442\u0438\u043f \u0431\u0430\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u0442 \u0434\u0430\u0440\u0438\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.<\/p>\n<p>\u0412 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0435 \u0435\u0441\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u043a\u00a0<code>VCOLS<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442-\u0441\u0442\u0440\u043e\u043a\u0443\u00a0<code>sqlite3_mprintf<\/code>:<\/p>\n<pre><code>char *sql = sqlite3_mprintf(\"SELECT\" VCOLS \"FROM _values WHERE _id_structure=?1 \"                            \"AND _id_object=?2 AND %s LIMIT 1\", cond);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043b datetime-\u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u043d\u0430 \u0432\u044b\u0432\u043e\u0434 \u0447\u0435\u0440\u0435\u0437\u00a0<code>strftime('%Y-%m-%dT%H:%M:%fZ', _DateTimeOffset)<\/code>, \u044f \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u043b \u044d\u0442\u043e\u0442\u00a0<code>strftime<\/code>\u00a0\u043f\u0440\u044f\u043c\u043e \u0432\u00a0<code>VCOLS<\/code>. \u0418 \u0432\u0441\u0451 \u0440\u0430\u0437\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u044c\u00a0<strong>\u043c\u043e\u043b\u0447\u0430<\/strong>: \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0443\u0441\u0442\u044b\u043c\u0438\u00a0<code>properties<\/code>, \u0430 base-\u0434\u0430\u0442\u044b \u2014 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041f\u043e\u043b\u0447\u0430\u0441\u0430 \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0435 \u0442\u0443\u0434\u0430. \u0420\u0430\u0437\u0433\u0430\u0434\u043a\u0430:\u00a0<code>VCOLS<\/code>\u00a0\u0443\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0<strong>\u0444\u043e\u0440\u043c\u0430\u0442-\u0441\u0442\u0440\u043e\u043a\u0443<\/strong>\u00a0<code>sqlite3_mprintf<\/code>, \u0430\u00a0<code>%Y %m %d %H %M %f<\/code>\u00a0\u0434\u043b\u044f mprintf \u2014 \u044d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u0430. \u041e\u043d \u043d\u0430\u0447\u0430\u043b \u00ab\u0441\u044a\u0435\u0434\u0430\u0442\u044c\u00bb \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u00a0<code>cond<\/code>\u00a0\u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435\u00a0<code>%Y<\/code>, \u0434\u0430\u043b\u044c\u0448\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0435\u0445\u0430\u043b\u043e, SQL \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0431\u0438\u0442\u044b\u0439,\u00a0<code>sqlite3_prepare_v2<\/code>\u00a0<strong>\u043c\u043e\u043b\u0447\u0430<\/strong>\u00a0\u0432\u0435\u0440\u043d\u0443\u043b \u043e\u0448\u0438\u0431\u043a\u0443, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u043f\u0441\u043e\u0432 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043f\u0443\u0441\u0442\u043e. Base-\u0434\u0430\u0442\u044b \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0446\u0435\u043b\u0435\u043b\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0445 SELECT \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0<code>prepare_v2<\/code>\u00a0\u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0431\u0435\u0437 mprintf.<\/p>\n<p>\u041b\u0435\u0447\u0438\u0442\u0441\u044f \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u2014\u00a0<code>%%<\/code>\u00a0(mprintf \u0441\u0432\u0435\u0440\u043d\u0451\u0442\u00a0<code>%%<\/code>\u2192<code>%<\/code>\u00a0<em>\u0434\u043e<\/em>\u00a0\u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0443 \u0443\u0432\u0438\u0434\u0438\u0442 SQLite):<\/p>\n<pre><code>\/\/ \u0431\u044b\u043b\u043e: ... strftime('%Y-%m-%dT%H:%M:%fZ',_DateTimeOffset) ...   \/\/ \u043b\u043e\u043c\u0430\u0435\u0442 mprintf\/\/ \u0441\u0442\u0430\u043b\u043e:#define VCOLS \" _id,_String,_Long,_Guid,_Double, \" \\  \"strftime('%%Y-%%m-%%dT%%H:%%M:%%fZ',_DateTimeOffset), \" \\  \"_Boolean,_ByteArray,_Numeric,_ListItem,_Object,_array_parent_id,_array_index \"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0440\u0430\u043b\u044c \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435:\u00a0<strong>\u043a\u043e\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0448\u044c SQL \u0447\u0435\u0440\u0435\u0437 printf-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\u0442\u0435\u0440, \u043b\u044e\u0431\u0430\u044f\u00a0<\/strong><code><strong>%<\/strong><\/code><strong>\u00a0\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043c\u0438\u043d\u0430.<\/strong>\u00a0\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0432\u0430\u0440\u043d\u043e, \u0447\u0442\u043e \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u0445\u043e\u0435:\u00a0<code>prepare<\/code>\u00a0\u043d\u0435 \u043a\u0438\u0434\u0430\u0435\u0442, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u0433\u043b\u044f\u0434\u0435\u0442\u044c, \u0438 \u043d\u0430\u0440\u0443\u0436\u0443 \u044d\u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u00ab\u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043f\u0443\u0441\u0442\u044b\u0435 \u043f\u0440\u043e\u043f\u0441\u044b\u00bb.<\/p>\n<hr\/>\n<h3>\u0427\u0430\u0441\u0442\u044c 2. \u0423 SQLite \u043d\u0435\u0442 \u0442\u0438\u043f\u0430 \u00ab\u0434\u0430\u0442\u0430\u00bb. \u041a\u0430\u043a \u043c\u044b \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0436\u0438\u043b\u0438 \u0440\u0435\u043b\u0438\u0437<\/h3>\n<p>\u042d\u0442\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0432\u044b\u043f\u0443\u0441\u043a\u0430, \u0438 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u043d\u043e\u043d\u0441\u0430 \u0435\u0451 \u0435\u0449\u0451 \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<h4>\u0422\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/h4>\n<p>\u0412 SQLite \u0434\u0430\u0442\u0430-\u0432\u0440\u0435\u043c\u044f \u2014 \u044d\u0442\u043e\u00a0<strong>\u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0440\u0451\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f<\/strong>, \u0430 \u043d\u0435 \u0442\u0438\u043f:<\/p>\n<ul>\n<li>\n<p><strong>TEXT<\/strong>\u00a0\u2014 ISO-8601 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 (<code>'2024-06-15 13:45:30'<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>REAL<\/strong>\u00a0\u2014 Julian day, \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 (\u0430\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0447\u0451\u0442 \u0434\u043d\u0435\u0439).<\/p>\n<\/li>\n<li>\n<p><strong>INTEGER<\/strong>\u00a0\u2014 Unix-\u044d\u043f\u043e\u0445\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.<\/p>\n<\/li>\n<\/ul>\n<p><code>DateTimeOffset<\/code>\u00a0\u0438\u0437 .NET \u0441\u044e\u0434\u0430 \u043d\u0435 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u0441\u0430\u043c \u0441\u043e\u0431\u043e\u0439. \u041d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0435\u0433\u043e\u00a0<strong>\u0432\u0435\u0437\u0434\u0435<\/strong>: \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 (\u0431\u0438\u043d\u0434\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432), \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438 (\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 + \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b \u0441\u043a\u0430\u043b\u044f\u0440\u043e\u0432), \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u0430, \u0432 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430\u0445. \u041e\u0434\u0438\u043d \u043f\u0440\u043e\u043c\u0430\u0445 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u2014 \u0438 \u0434\u0430\u0442\u044b \u00ab\u043a\u0430\u043a \u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442\u00bb, \u043d\u043e \u0432\u0440\u0443\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445.<\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 TEXT (\u0445\u043e\u0442\u044f \u0442\u0430\u043a \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c)<\/h4>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0430 \u0434\u0430\u0442\u044b \u0441\u0442\u0440\u043e\u043a\u043e\u0439 ISO. \u0418 \u0441\u043b\u043e\u043c\u0430\u043b\u0430\u0441\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u0442.<\/p>\n<p><code>datetime('now')<\/code>\u00a0\u0432 SQLite \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u00a0<strong>\u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c<\/strong>\u00a0\u043c\u0435\u0436\u0434\u0443 \u0434\u0430\u0442\u043e\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c:\u00a0<code>2024-06-15 13:45:30<\/code>. \u0410 \u043b\u0438\u0442\u0435\u0440\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 C#-\u0441\u043b\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u00a0<code><strong>T<\/strong><\/code>:\u00a0<code>2024-06-15T13:45:30<\/code>. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 TEXT \u0432 SQLite \u2014\u00a0<strong>\u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435, \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0435<\/strong>. \u0418 \u0432\u043e\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 10:<\/p>\n<pre><code>'2024-06-15 13:45:30'   \u0431\u0430\u0439\u0442[10] = 0x20 (\u043f\u0440\u043e\u0431\u0435\u043b)'2024-06-15T13:45:30'   \u0431\u0430\u0439\u0442[10] = 0x54 ('T')0x20 &lt; 0x54  \u2192  \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c \u0412\u0421\u0415\u0413\u0414\u0410 \u00ab\u043c\u0435\u043d\u044c\u0448\u0435\u00bb \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 'T'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u00ab\u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0435 (\u0441 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c) \u27f7 \u043b\u0438\u0442\u0435\u0440\u0430\u043b (\u0441 T)\u00bb \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443\u00a0<strong>\u0432\u0441\u0435\u0433\u0434\u0430<\/strong>, \u0431\u0435\u0437\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043d\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0442\u0438\u0445\u043e \u0432\u0440\u0430\u0442\u044c. \u0412 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u044d\u0442\u043e \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u043b\u043e \u0436\u0438\u0432\u0443\u044e \u043d\u043e\u0434\u0443 \u043c\u0451\u0440\u0442\u0432\u043e\u0439: heartbeat-\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u00a0<code>last_seen &lt; cutoff<\/code>\u00a0\u0431\u044b\u043b\u043e \u00ab\u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u00bb, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0435\u00a0<code>last_seen<\/code>\u00a0(\u0441 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c) \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 cutoff-\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430 (\u0441 T). \u041d\u043e\u0434\u0430 \u0436\u0438\u0432\u0430, \u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0451 \u0442\u0440\u0443\u043f\u043e\u043c.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u043f\u0430\u0440\u0430\u0442\u043e\u0440. \u041d\u043e \u044d\u0442\u043e \u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u043f\u0442\u043e\u043c\u0430: TEXT-\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c, \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442-\u0434\u0440\u0435\u0439\u0444 (\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0442\u0430\u0439\u043c\u0437\u043e\u043d\u043d\u044b\u0439 \u0441\u0443\u0444\u0444\u0438\u043a\u0441, \u0432\u0435\u0434\u0443\u0449\u0438\u0435 \u043d\u0443\u043b\u0438) \u0441\u043d\u043e\u0432\u0430 \u0432\u0441\u043a\u0440\u043e\u0435\u0442 \u0442\u0443 \u0436\u0435 \u0434\u044b\u0440\u0443. \u041d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0439\u0442\u0438 \u043e\u0442 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<h4>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: REAL Julian day, \u0432\u0441\u0451 \u0432 UTC<\/h4>\n<p>\u041f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430\u00a0<strong>REAL Julian day, \u0432\u0441\u0451 \u0432 UTC<\/strong>\u00a0\u2014 \u0440\u043e\u0432\u043d\u043e \u043a\u0430\u043a Postgres \u0434\u0435\u0440\u0436\u0438\u0442\u00a0<code>timestamptz<\/code>\u00a0\u0432 UTC. \u0422\u0440\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u044b, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435 \u00ab\u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435\u00bb, \u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440:<\/p>\n<p><strong>1. \u0420\u043e\u0434\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 SQLite \u0435\u0434\u044f\u0442 Julian-\u0447\u0438\u0441\u043b\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.<\/strong>\u00a0<code>julianday()<\/code>,\u00a0<code>strftime()<\/code>,\u00a0<code>datetime()<\/code>,\u00a0<code>date()<\/code>\u00a0\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 REAL Julian \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u0431\u0435\u0437 \u043e\u0431\u0451\u0440\u0442\u043e\u043a:<\/p>\n<pre><code class=\"sql\">sqlite&gt; SELECT strftime('%Y-%m-%dT%H:%M:%fZ', 2460477.0732638887);2024-06-15T13:45:30.000Zsqlite&gt; SELECT datetime(2460477.0732638887);2024-06-15 13:45:30sqlite&gt; SELECT julianday('2024-06-15T13:45:30Z');2460477.0732638887<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u0430\u0442\u044b \u0432 JSON \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u0432\u00a0<code>strftime<\/code>\u00a0\u2014 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 ISO, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 System.Text.Json \u043f\u0430\u0440\u0441\u0438\u0442 \u0448\u0442\u0430\u0442\u043d\u043e.<\/p>\n<p><strong>2. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c.<\/strong>\u00a0<code>col &lt; X<\/code>\u00a0\u043f\u043e\u00a0<code>double<\/code>\u00a0\u2014 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0438 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u0430, \u0430 \u043d\u0435 \u0431\u0430\u0439\u0442\u044b.<\/p>\n<p><strong>3. \u0418, \u0447\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430, \u2014 sargable (\u0434\u0440\u0443\u0436\u0438\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c).<\/strong>\u00a0\u0412\u043e\u0442 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044c, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0451 \u0438 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u043e\u0441\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c\u00a0<strong>\u043a\u043e\u043b\u043e\u043d\u043a\u0443<\/strong>\u00a0\u043f\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u2014\u00a0<code>julianday(col) &lt; X<\/code>\u00a0\u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u00a0<code>col<\/code>\u00a0\u0443\u043c\u0438\u0440\u0430\u0435\u0442: \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u043e\u0442 \u043a\u043e\u043b\u043e\u043d\u043a\u0438. \u0410 \u0432\u043e\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u00a0<strong>\u0441\u044b\u0440\u043e\u0439 REAL-\u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439<\/strong>\u00a0\u2014\u00a0<code>col &lt; julianday('2024-06-15')<\/code>\u00a0\u2014 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u043e: \u0441\u043b\u0435\u0432\u0430 \u0433\u043e\u043b\u0430\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0430, \u0441\u043f\u0440\u0430\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 SQL \u043c\u044b \u0432\u0435\u0448\u0430\u0435\u043c\u00a0<code>julianday(...)<\/code>\u00a0<strong>\u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430<\/strong>, \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0443:<\/p>\n<pre><code class=\"sql\">-- \u041d\u0415 \u0442\u0430\u043a (\u0443\u0431\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e _date_create):WHERE julianday(o._date_create) &gt;= julianday('2023-01-01')-- \u0430 \u0442\u0430\u043a (sargable):WHERE o._date_create &gt;= julianday('2023-01-01')<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043b\u043e\u043d\u043a\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 Julian-\u0447\u0438\u0441\u043b\u043e \u2192 \u0435\u0451 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441 Julian-\u0447\u0438\u0441\u043b\u043e\u043c, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b.<\/p>\n<h4>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f: \u0431\u0435\u0437 \u043c\u0430\u0433\u0438\u0438, \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c .NET<\/h4>\n<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u00a0<code>DateTime<\/code>\/<code>DateTimeOffset<\/code>\u00a0\u27f7 Julian \u2014 \u044d\u0442\u043e \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445\u00a0<code>ToOADate<\/code>\/<code>FromOADate<\/code>. OLE Automation date (\u044d\u043f\u043e\u0445\u0430 1899-12-30) \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 Julian day \u0440\u043e\u0432\u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443\u00a0<code>2415018.5<\/code>:<\/p>\n<pre><code>internal static class SqliteJulian{    \/\/ Julian = OADate + 2415018.5. ToOADate\/FromOADate \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0438 lossless    \/\/ \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 double \u2014 \u0442\u043e\u0439 \u0436\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0436\u0438\u0432\u0451\u0442 julianday() SQLite.    private const double OADateToJulianOffset = 2415018.5;    \/\/ DateTimeOffset \u2192 UTC Julian. .UtcDateTime \u041f\u0420\u0418\u041c\u0415\u041d\u042f\u0415\u0422 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u2192 \u0438\u0441\u0442\u0438\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 UTC.    public static double ToJulian(DateTimeOffset dto) =&gt; dto.UtcDateTime.ToOADate() + OADateToJulianOffset;    \/\/ DateTime \u2192 UTC Julian. Clock-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u043a\u0442\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a UTC \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443 redb    \/\/ (NormalizeForStorage \u0441\u0442\u0430\u0432\u0438\u0442 Kind=Utc \u0431\u0435\u0437 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438). ToOADate \u0438\u0433\u043d\u043e\u0440\u0438\u0442 Kind \u2014 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442.    public static double ToJulian(DateTime dt) =&gt; dt.ToOADate() + OADateToJulianOffset;    \/\/ REAL Julian \u2192 DateTimeOffset(+00:00)    public static DateTimeOffset FromJulian(double julian)    {        var utc = DateTime.SpecifyKind(DateTime.FromOADate(julian - OADateToJulianOffset), DateTimeKind.Utc);        return new DateTimeOffset(utc, TimeSpan.Zero);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0413\u0434\u0435 \u044d\u0442\u043e \u0432\u0442\u044b\u043a\u0430\u0435\u0442\u0441\u044f: \u0447\u0435\u0442\u044b\u0440\u0435 \u0442\u043e\u0447\u043a\u0438<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044b \u043d\u0435 \u0432\u0440\u0430\u043b\u0438, REAL-Julian-\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0434\u043e \u0441\u043e\u0431\u043b\u044e\u0441\u0442\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u043a\u0430\u0445, \u0433\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 C# \u27f7 SQLite:<\/p>\n<p><strong>\u0417\u0430\u043f\u0438\u0441\u044c \u2014 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d\u0434\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/strong>\u00a0\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 (\u0438 base-\u0434\u0430\u0442\u044b, \u0438 props) \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u0443 \u0442\u043e\u0447\u043a\u0443 \u2014\u00a0<code>CreateCommand<\/code>\u00a0\u0432\u00a0<code>SqliteRedbConnection<\/code>. \u0422\u0430\u043c\u00a0<code>DateTimeOffset<\/code>\/<code>DateTime<\/code>\u00a0\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u00a0<code>double<\/code>:<\/p>\n<pre><code>switch (param){    case DateTimeOffset dto:        \/\/ REAL Julian day (UTC) \u2014 \u0440\u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 SQLite-\u0434\u0430\u0442.        sqliteParam.Value = SqliteJulian.ToJulian(dto);        break;    case DateTime dt2:        sqliteParam.Value = SqliteJulian.ToJulian(dt2);        break;    \/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0427\u0442\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u043e\u0432 \u2014\u00a0<\/strong><code><strong>ConvertScalar<\/strong><\/code><strong>.<\/strong>\u00a0\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 SQLite \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a\u00a0<code>double<\/code>; \u0434\u043b\u044f \u0442\u0435\u043c\u043f\u043e\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043b\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e:<\/p>\n<pre><code>if (targetType == typeof(DateTimeOffset))    return (T)(object)(value is double jdo ? SqliteJulian.FromJulian(jdo)        : value is DateTimeOffset d ? d        : value is DateTime dt ? new DateTimeOffset(dt, TimeSpan.Zero)        : DateTimeOffset.Parse(value.ToString()!, ...));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0427\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u2014\u00a0<\/strong><code><strong>MapRow<\/strong><\/code><strong>.<\/strong>\u00a0\u0422\u043e\u0442 \u0436\u0435\u00a0<code>double \u2192 DateTimeOffset\/DateTime\/DateOnly<\/code>\u00a0\u043f\u0440\u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0435 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p><strong>\u041d\u0430\u0442\u0438\u0432\u043a\u0430.<\/strong>\u00a0<code>get_object_json<\/code>\u00a0\u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0434\u0430\u0442\u0443 \u0447\u0435\u0440\u0435\u0437\u00a0<code>strftime(ISO, col)<\/code>\u00a0(\u0441\u043c. \u0431\u0430\u0439\u043a\u0443 \u043f\u0440\u043e\u00a0<code>%%<\/code>), \u0430 pvt-\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442 \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u0432\u00a0<code>julianday('&lt;iso&gt;')<\/code>.<\/p>\n<h4>\u0422\u0440\u0438 CLR-\u0442\u0438\u043f\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435<\/h4>\n<p>\u041a\u043e\u043b\u043e\u043d\u043a\u0430\u00a0<code><em>values.<\/em>DateTimeOffset<\/code>\u00a0(REAL) \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u00a0<strong>\u0442\u0440\u0438<\/strong>\u00a0CLR-\u0442\u0438\u043f\u0430:<\/p>\n<ul>\n<li>\n<p><code>DateTimeOffset<\/code>\u00a0\u2014 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p><code>DateTime<\/code>\u00a0\u2014 clock-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a UTC (\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 redb).<\/p>\n<\/li>\n<li>\n<p><code>DateOnly<\/code>\u00a0\u2014 \u043f\u043e\u043b\u043d\u043e\u0447\u044c UTC.<\/p>\n<\/li>\n<\/ul>\n<p>(<code>TimeOnly<\/code>\/<code>TimeSpan<\/code>\u00a0\u0435\u0434\u0443\u0442 \u0432\u00a0<code>_String<\/code>.) \u0420\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u0438\u0445 RTTI \u0432 \u0441\u0445\u0435\u043c\u0435: db-\u0442\u0438\u043f \u043f\u043e\u043b\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0443, \u0432\u043e \u0447\u0442\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u00a0<code>double<\/code>.<\/p>\n<h4>\u0422\u0430\u0439\u043c\u0437\u043e\u043d\u044b: \u043f\u043e\u0447\u0435\u043c\u0443\u00a0+4\u00a0\u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e<\/h4>\n<p>\u0427\u0430\u0441\u0442\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u043e\u0432:\u00a0<em>\u00ab\u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u0432 LINQ\u00a0<\/em><code><em>DateTimeOffset<\/em><\/code><em>\u00a0\u0441 \u0437\u043e\u043d\u043e\u0439\u00a0<\/em><code><em>+04:00<\/em><\/code><em>\u00a0\u2014 \u043e\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u0431\u0430\u0437\u0435?\u00bb<\/em>\u00a0\u0414\u0430, \u0438 \u0432\u043e\u0442 \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ul>\n<li>\n<p><strong>C#-\u0441\u0442\u043e\u0440\u043e\u043d\u0430:<\/strong>\u00a0<code>ToJulian(DateTimeOffset)<\/code>\u00a0\u0431\u0435\u0440\u0451\u0442\u00a0<code>dto.UtcDateTime<\/code>\u00a0\u2014 \u0430\u00a0<code>.UtcDateTime<\/code>\u00a0<strong>\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435<\/strong>\u00a0\u0438 \u0434\u0430\u0451\u0442 \u0438\u0441\u0442\u0438\u043d\u043d\u044b\u0439 UTC-\u043c\u043e\u043c\u0435\u043d\u0442. \u0422\u043e \u0435\u0441\u0442\u044c\u00a0<code>+04:00<\/code>\u00a0\u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 UTC \u0435\u0449\u0451 \u0434\u043e Julian.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430:<\/strong>\u00a0\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u043f\u0440\u043e\u0441\u043e\u0447\u0438\u043b\u0441\u044f offset, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0<code>julianday('&lt;iso-\u0441-offset&gt;')<\/code>, \u0430\u00a0<code><strong>julianday()<\/strong><\/code><strong>\u00a0\u0441\u0430\u043c \u043f\u0430\u0440\u0441\u0438\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435<\/strong>:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"sql\">sqlite&gt; SELECT julianday('2026-06-25T20:00:00+04:00') = julianday('2026-06-25T16:00:00Z');1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0425\u0440\u0430\u043d\u0438\u043b\u0438 UTC \u2192 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u043e UTC-\u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u2192 \u0432\u0441\u0451 \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043b\u044e\u0431\u044b\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c.<\/p>\n<h4>\u0411\u043e\u0435\u0432\u0430\u044f \u0431\u0430\u0439\u043a\u0430 \u21162: \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u0438\u00a0FormatException\u00a0\u0438\u0437 \u043d\u0438\u043e\u0442\u043a\u0443\u0434\u0430<\/h4>\n<p>\u0421\u0430\u043c\u0430\u044f \u043a\u0430\u0432\u0435\u0440\u0437\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c datetime-\u0438\u0441\u0442\u043e\u0440\u0438\u0438.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0<code>get_object_json<\/code>\u00a0\u2014 \u043e\u043d \u043e\u0442\u0434\u0430\u0451\u0442 \u0434\u0430\u0442\u0443\u00a0<strong>\u0441\u0442\u0440\u043e\u043a\u043e\u0439 ISO<\/strong>\u00a0(\u0447\u0435\u0440\u0435\u0437\u00a0<code>strftime<\/code>), \u0438 C# \u0435\u0451 \u043f\u0430\u0440\u0441\u0438\u0442 \u0448\u0442\u0430\u0442\u043d\u043e. \u041d\u043e\u00a0<strong>\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430<\/strong>\u00a0\u2014\u00a0<code>MinRedbAsync<\/code>\/<code>MaxRedbAsync<\/code>,\u00a0<code>AggregateRedbAsync<\/code>, \u043e\u043a\u043e\u043d\u043d\u044b\u0435, \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u2014\u00a0<code>get_object_json<\/code>\u00a0<strong>\u043c\u0438\u043d\u0443\u0435\u0442<\/strong>. \u041e\u043d\u0430 \u0442\u0430\u0449\u0438\u0442 \u0434\u0430\u0442\u0443-\u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u043f\u0440\u044f\u043c\u043e \u0432\u00a0<code>SELECT<\/code>\u00a0\u0438 \u043e\u0442\u0434\u0430\u0451\u0442\u00a0<strong>\u0441\u044b\u0440\u043e\u0435 Julian-\u0447\u0438\u0441\u043b\u043e<\/strong>\u00a0\u0432 \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u044f\u0434\u0440\u0430. \u0410 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u0436\u0434\u0430\u043b \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u043b\u0438\u00a0<code>DateTime<\/code>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014\u00a0<code>FormatException<\/code>\u00a0\u043d\u0430 \u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 (\u0430 \u0435\u0449\u0451 \u0432\u0435\u0441\u0435\u043b\u0435\u0435:\u00a0<code>elem.GetInt64()<\/code>\u00a0\u043d\u0430 \u0434\u0440\u043e\u0431\u043d\u043e\u043c\u00a0<code>2460477.07<\/code>\u00a0\u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0434 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 Unix-timestamp).<\/p>\n<p>\u0420\u0430\u0437\u0432\u0438\u043b\u043a\u0430 \u0444\u0438\u043a\u0441\u0430 \u0431\u044b\u043b\u0430 \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043b\u0430\u0442\u0430\u0442\u044c SQLite-\u043a\u043e\u0441\u0442\u044b\u043b\u0451\u043c \u043f\u0440\u044f\u043c\u043e \u0432 \u044f\u0434\u0440\u0435 \u2014 \u043d\u043e \u0443\u00a0<code>redb.Core<\/code>\u00a0\u043d\u0435\u0442 (\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c) \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u0440\u043e Julian: \u044d\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 SQLite, \u0430 \u044f\u0434\u0440\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0440\u0438 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0430. PG\/MSSql \u043e\u0442\u0434\u0430\u044e\u0442 \u0434\u0430\u0442\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0438 \u0442\u0430\u0449\u0438\u0442\u044c \u0432 \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u0441\u043b\u043e\u0432\u043e \u00abJulian\u00bb \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0442\u0435\u0447\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0432\u043e \u0432\u0441\u0435.<\/p>\n<p>\u0421\u0434\u0435\u043b\u0430\u043b\u0438 \u0447\u0435\u0440\u0435\u0437\u00a0<strong>\u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/strong>. \u0412 \u044f\u0434\u0440\u0435 \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u0443\u043a \u00ab\u0447\u0438\u0441\u043b\u043e \u2192 \u0442\u0435\u043c\u043f\u043e\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f\u00bb, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0443\u0441\u0442\u043e\u0439:<\/p>\n<pre><code>\/\/ redb.Core: \u044f\u0434\u0440\u043e \u041d\u0415 \u0437\u043d\u0430\u0435\u0442 \u0441\u043b\u043e\u0432\u0430 \"Julian\". \u0422\u043e\u043b\u044c\u043a\u043e: \"\u0435\u0441\u043b\u0438 \u0427\u0418\u0421\u041b\u041e \u043c\u0435\u0442\u0438\u0442 \u0432 \u0434\u0430\u0442\u0443\/\/ \u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u2014 \u0441\u043f\u0440\u043e\u0441\u0438 \u0435\u0433\u043e\".public static class TemporalDecoder{    public static Func&lt;double, Type, object?&gt;? NumericDecoder;    public static bool IsTemporal(Type t) =&gt;        t == typeof(DateTime) || t == typeof(DateTimeOffset) || t == typeof(DateOnly);    \/\/ Convert.ChangeType, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0451\u0442 \u0447\u0438\u0441\u043b\u0443-\u0432-\u0434\u0430\u0442\u0443 \u043f\u0440\u043e\u0439\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043a\u043e\u0434\u0435\u0440.    public static object ChangeType(object value, Type targetType) =&gt;        TryDecode(value, targetType, out var d) &amp;&amp; d != null ? d        : System.Convert.ChangeType(value, targetType);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410\u00a0<strong>\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442<\/strong>\u00a0\u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0441\u0430\u043c SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u2014 \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435\u00a0<code>SqliteDataSource<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0451\u0440\u0433\u0430\u0435\u0442\u0441\u044f \u0438 \u0434\u043b\u044f Free, \u0438 \u0434\u043b\u044f Pro:<\/p>\n<pre><code>TemporalDecoder.NumericDecoder = static (julian, targetType) =&gt;{    var dto = SqliteJulian.FromJulian(julian);    if (targetType == typeof(DateTimeOffset)) return dto;    if (targetType == typeof(DateOnly))       return DateOnly.FromDateTime(dto.UtcDateTime);    return dto.UtcDateTime; \/\/ DateTime};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u0434\u0432\u0430 \u043c\u0435\u0441\u0442\u0430 \u0432 \u044f\u0434\u0440\u0435, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f\u00a0<strong>\u0432\u0441\u044f<\/strong>\u00a0\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 (\u0438 \u0434\u043b\u044f Free, \u0438 \u0434\u043b\u044f Pro, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 Pro \u043d\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u2014 \u043e\u043d \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b \u044f\u0434\u0440\u0430):<\/p>\n<ol>\n<li>\n<p><code>JsonValueConverter<\/code>\u00a0\u2014 \u0432\u0435\u0442\u043a\u0430\u00a0<code>Number<\/code>\u00a0\u2192 \u0442\u0435\u043c\u043f\u043e\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f (group-by, window, \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438).<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0451\u0440\u0442\u043a\u0430\u00a0<code>TemporalDecoder.ChangeType<\/code>\u00a0\u0432 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 (<code>MinRedbAsync<\/code>\/<code>MaxRedbAsync<\/code>,\u00a0<code>AggregateResult.Get&lt;T&gt;<\/code>).<\/p>\n<\/li>\n<\/ol>\n<p>PG\/MSSql \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u0434\u0430\u0442\u044b \u043d\u0435 \u043e\u0442\u0434\u0430\u044e\u0442 \u2014 \u0443 \u043d\u0438\u0445\u00a0<code>NumericDecoder<\/code>\u00a0\u0442\u0430\u043a \u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f\u00a0<code>null<\/code>, \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0438 \u043d\u0430 \u0431\u0430\u0439\u0442. \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u00a0<code>2415018.5<\/code>\u00a0\u0438 \u0441\u043b\u043e\u0432\u043e \u00abJulian\u00bb \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f\u00a0<strong>\u0432\u043d\u0443\u0442\u0440\u0438\u00a0<\/strong><code><strong>redb.SQLite<\/strong><\/code>, \u0430 \u044f\u0434\u0440\u043e \u2014 storage-agnostic.<\/p>\n<p>\u042d\u0442\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u043a\u0443\u0441, \u0438 \u0435\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0438\u043a\u0441\u0430: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f (SQLite \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u0442\u0443 \u0447\u0438\u0441\u043b\u043e\u043c), \u0430 \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u043d\u0435 \u0440\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u0435\u043c SQLite-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u043f\u043e \u044f\u0434\u0440\u0443, \u0430 \u043e\u0434\u043d\u043e\u0439 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0451\u0440\u0433\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0442, \u043a\u043e\u043c\u0443 \u043d\u0430\u0434\u043e.<\/p>\n<hr\/>\n<h3>\u0427\u0430\u0441\u0442\u044c 3. pvt-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440: \u043a\u0430\u043a \u0444\u0438\u043b\u044c\u0442\u0440 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f SQL<\/h3>\n<p>\u0420\u0430\u0437 \u0443\u0436 \u0434\u0432\u0438\u0436\u043e\u043a \u2014 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0442\u043e\u0440 \u0444\u0438\u043b\u044c\u0442\u0440-JSON \u0432 SQL, \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u0443\u0441\u043e\u043a \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0442\u043e\u0440\u0430. \u042d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u00ab\u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb \u0447\u0430\u0441\u0442\u044c.<\/p>\n<h4>\u0424\u0438\u043b\u044c\u0442\u0440-JSON<\/h4>\n<p>LINQ-<code>Where<\/code>\u00a0C# \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432 \u0444\u0430\u0441\u0435\u0442-\u0444\u0438\u043b\u044c\u0442\u0440 \u2014 JSON, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043a\u0430. \u0421\u043a\u0430\u0436\u0435\u043c,\u00a0<code>Where(e =&gt; e.LastName == \"NullableTest\")<\/code>\u00a0\u0434\u043b\u044f prop-\u043f\u043e\u043b\u044f \u0434\u0430\u0451\u0442:<\/p>\n<pre><code class=\"json\">{ \"LastName\": { \"$eq\": \"NullableTest\" } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410\u00a0<code>WhereRedb(o =&gt; o.ParentId == null)<\/code>\u00a0\u0434\u043b\u044f base-\u043f\u043e\u043b\u044f (\u043c\u0430\u0440\u043a\u0435\u0440\u00a0<code>0$:<\/code>\u00a0\u2014 \u00ab\u044d\u0442\u043e base, \u043d\u0435 prop\u00bb):<\/p>\n<pre><code class=\"json\">{ \"0$:ParentId\": null }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u2014 \u043d\u0435\u044f\u0432\u043d\u044b\u0439\u00a0<code>$and<\/code>\u00a0\u043f\u043e \u043a\u043b\u044e\u0447\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"json\">{ \"0$:ParentId\": null, \"LastName\": { \"$eq\": \"NullableTest\" } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0420\u0430\u0441\u0449\u0435\u043f\u043b\u0435\u043d\u0438\u0435: push vs residual<\/h4>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014\u00a0<code>pvtSplitFilter<\/code>. \u041e\u043d\u0430 \u0434\u0435\u043b\u0438\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p><strong>push<\/strong>\u00a0\u2014 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u043e base-\u043f\u043e\u043b\u044f\u043c \u0438 \u043f\u0440\u043e\u043f\u0441\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0442\u043e\u043b\u043a\u0430\u0442\u044c\u00a0<em>\u0432\u043d\u0443\u0442\u0440\u044c<\/em>\u00a0CTE (\u0432 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u00a0<code><em>objects<\/em><\/code><em>\/<\/em><code>values<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>residual<\/strong>\u00a0\u2014 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f\u00a0<em>\u0441\u043d\u0430\u0440\u0443\u0436\u0438<\/em>, \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0438\u0432\u043e\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u00ab\u0444\u043e\u0440\u043c\u00bb \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u043e\u0431\u0435\u0440\u0451\u0442\u0441\u044f. \u0418\u0445 \u0442\u0440\u0438:<\/p>\n<ul>\n<li>\n<p><strong>Shape A \u2014 pure-base flat:<\/strong>\u00a0\u0444\u0438\u043b\u044c\u0442\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e base-\u043f\u043e\u043b\u044f\u043c, \u043f\u0440\u043e\u043f\u0441\u043e\u0432 \u043d\u0435\u0442. \u0422\u043e\u0433\u0434\u0430 CTE \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0432\u043e\u043e\u0431\u0449\u0435:\u00a0<code>SELECT <em>id FROM <\/em>objects o WHERE o._id_scheme=? AND &lt;push&gt;<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>narrow<\/strong>\u00a0\u2014 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u043f\u0441\u044b, \u0444\u0438\u043b\u044c\u0442\u0440 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u0438\u0432\u043e\u0442\u0443: \u0441\u0442\u0440\u043e\u0438\u043c CTE\u00a0<code><em>pvt<\/em>cte<\/code>\u00a0(\u043f\u0438\u0432\u043e\u0442\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0447\u0435\u0440\u0435\u0437\u00a0<code>MAX(...) FILTER (WHERE <em>id<\/em>structure=? AND <em>array<\/em>index IS NULL)<\/code>), \u0434\u0436\u043e\u0439\u043d\u0438\u043c \u0441\u00a0<code>_objects<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>non-narrow<\/strong>\u00a0\u2014 \u0435\u0441\u0442\u044c \u043d\u0435\u0440\u0430\u0441\u0449\u0435\u043f\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044e), \u043d\u0443\u0436\u0435\u043d \u0432\u043d\u0435\u0448\u043d\u0438\u0439 WHERE.<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 SQL \u0434\u043b\u044f\u00a0<code>Where(LastName) + WhereRedb(ParentId IS NULL)<\/code>\u00a0(narrow-\u0444\u043e\u0440\u043c\u0430) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"sql\">WITH _pvt_cte AS (    SELECT v._id_object,           MAX(v._String) FILTER (WHERE v._id_structure = 1000012 AND v._array_index IS NULL) AS \"LastName\"    FROM _values v    WHERE v._id_structure IN (1000012)      AND v._id_object IN (            SELECT o._id FROM _objects o            WHERE o._id_scheme = 1000010 AND o._id_parent IS NULL   -- \u2190 push base-\u0443\u0441\u043b\u043e\u0432\u0438\u044f          )    GROUP BY v._id_object)SELECT o._id FROM _pvt_cteJOIN _objects o ON o._id = _pvt_cte._id_objectWHERE \"LastName\" = 'NullableTest'                                    -- \u2190 residual prop-\u0443\u0441\u043b\u043e\u0432\u0438\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: base-\u0443\u0441\u043b\u043e\u0432\u0438\u0435\u00a0<code>o._id_parent IS NULL<\/code>\u00a0\u0443\u0435\u0445\u0430\u043b\u043e\u00a0<strong>\u0432\u043d\u0443\u0442\u0440\u044c<\/strong>\u00a0\u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u00a0<code>_objects<\/code>\u00a0(push), \u0430 prop-\u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043f\u043e\u00a0<code>LastName<\/code>\u00a0\u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c\u00a0<strong>\u0441\u043d\u0430\u0440\u0443\u0436\u0438<\/strong>\u00a0(residual). \u042d\u0442\u043e \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u044c \u2014 \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u00a0<code>pvtSplitFilter<\/code>, \u0438 \u0440\u043e\u0432\u043d\u043e \u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u0431\u0430\u0433 (\u0441\u043c. \u043d\u0438\u0436\u0435).<\/p>\n<h4>\u0411\u043e\u0435\u0432\u0430\u044f \u0431\u0430\u0439\u043a\u0430 \u21163: \u043c\u0443\u043b\u044c\u0442\u0438-\u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u0442\u0435\u0440\u044f\u043b\u00a0null<\/h4>\n<p><code>WhereRedb(o =&gt; o.ParentId == null).Where(e =&gt; e.LastName == \"X\")<\/code>\u00a0\u043d\u0430 Free \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b \u0441\u0442\u0440\u043e\u043a\u0438,\u00a0<strong>\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0435\u0441\u0442\u044c<\/strong>. \u0422\u043e \u0435\u0441\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u00a0<code>IS NULL<\/code>\u00a0\u043c\u043e\u043b\u0447\u0430 \u0442\u0435\u0440\u044f\u043b\u043e\u0441\u044c \u2014 \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0441 prop-\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c. Base-only\u00a0<code>WhereRedb(o =&gt; o.ParentId == null)<\/code>\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u043b.<\/p>\n<p>\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430. \u041f\u0440\u044f\u043c\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u043d\u0430\u0442\u0438\u0432\u043a\u0438 \u043d\u0430 \u0442\u0440\u0451\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0445:<\/p>\n<pre><code class=\"sql\">-- 1) \u0442\u043e\u043b\u044c\u043a\u043e base IS NULL \u2014 \u0420\u0410\u0411\u041e\u0422\u0410\u0415\u0422:SELECT pvt_build_query_sql(1000010, '{\"0$:ParentId\":null}', ...);\u2192 ... WHERE o._id_scheme = 1000010 AND o._id_parent IS NULL-- 2) base equality \u2014 \u0420\u0410\u0411\u041e\u0422\u0410\u0415\u0422:SELECT pvt_build_query_sql(1000010, '{\"0$:ParentId\":5}', ...);\u2192 ... WHERE o._id_scheme = 1000010 AND o._id_parent = 5-- 3) base IS NULL + prop \u2014 base-\u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0418\u0421\u0427\u0415\u0417\u041b\u041e:SELECT pvt_build_query_sql(1000010, '{\"0$:ParentId\":null,\"LastName\":{\"$eq\":\"X\"}}', ...);\u2192 ... (\u0442\u043e\u043b\u044c\u043a\u043e LastName \u0432 CTE, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e o._id_parent IS NULL)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435\u00a0<code>{\"0$:ParentId\":null}<\/code>\u00a0\u043d\u0430\u0442\u0438\u0432\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, \u0430 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u2014 \u0442\u0435\u0440\u044f\u0435\u0442. \u041a\u043e\u0440\u0435\u043d\u044c \u2014 \u0432 \u043c\u0443\u043b\u044c\u0442\u0438-\u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0432\u0435\u0442\u043a\u0435\u00a0<code>pvtSplitFilter<\/code>. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0449\u0435\u043f\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043a\u043b\u044e\u0447\u0430 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440-\u043e\u0431\u044a\u0435\u043a\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0<code>pvtSingleton<\/code>:<\/p>\n<pre><code>static char *pvtSingleton(sqlite3 *db, const char *k, const char *v_json){  sqlite3_stmt *st = 0; char *r = 0;  sqlite3_prepare_v2(db, \"SELECT json_object(?1, json(?2))\", -1, &amp;st, 0);  \/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0446\u0438\u043a\u043b \u0431\u0440\u0430\u043b \u0438\u0437\u00a0<code>json_each<\/code>:<\/p>\n<pre><code>\/\/ \u0411\u042b\u041b\u041e:\"SELECT key, value FROM json_each(?1)\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u043b\u043e\u0432\u0443\u0448\u043a\u0430: \u0434\u043b\u044f JSON-<strong>null<\/strong>\u00a0\u043a\u043e\u043b\u043e\u043d\u043a\u0430\u00a0<code>value<\/code>\u00a0\u0432\u00a0<code>json_each<\/code>\u00a0\u2014 \u044d\u0442\u043e\u00a0<strong>SQL NULL<\/strong>. \u0422\u043e \u0435\u0441\u0442\u044c\u00a0<code>v_json<\/code>\u00a0\u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439,\u00a0<code>json(\"\")<\/code>\u00a0\u2014 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430,\u00a0<code>json_object(...)<\/code>\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b NULL, \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0441\u044f NULL \u2192\u00a0<code>pvtSplitFilter<\/code>\u00a0\u043d\u0430 NULL-\u0444\u0438\u043b\u044c\u0442\u0440\u0435 \u043e\u0442\u0434\u0430\u0432\u0430\u043b \u00ab\u043d\u0438\u0447\u0435\u0433\u043e\u00bb \u2192 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0442\u0438\u0445\u043e \u0438\u0441\u0447\u0435\u0437\u0430\u043b\u043e. (\u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b \u0441 \u0433\u043e\u043b\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c:\u00a0<code>json_each.value<\/code>\u00a0\u043e\u0442\u0434\u0430\u0451\u0442 \u0442\u0435\u043a\u0441\u0442 \u0431\u0435\u0437 \u043a\u0430\u0432\u044b\u0447\u0435\u043a,\u00a0<code>json(\"NullableTest\")<\/code>\u00a0\u2014 \u0441\u043d\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.) \u0412 base-only \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0443\u0442\u044c \u2014 \u0442\u0430\u043c \u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438\u00a0<code>type<\/code>, \u0438 null \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<p>\u0424\u0438\u043a\u0441 \u2014 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u00a0<strong>\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 JSON-\u0430\u0442\u043e\u043c \u043f\u043e \u0442\u0438\u043f\u0443<\/strong>\u00a0\u043f\u0440\u044f\u043c\u043e \u0432 SQL, \u0434\u043e\u00a0<code>pvtSingleton<\/code>:<\/p>\n<pre><code>\/\/ \u0421\u0422\u0410\u041b\u041e:\"SELECT key, CASE type \"\"  WHEN 'text'  THEN json_quote(value) \"   \/\/ \"X\" \u0441 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u043c\u0438\"  WHEN 'null'  THEN 'null' \"              \/\/ \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 JSON null\"  WHEN 'true'  THEN 'true' \"\"  WHEN 'false' THEN 'false' \"\"  ELSE value END \"                        \/\/ integer\/real\/object\/array \u2014 \u0443\u0436\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 JSON\"FROM json_each(?1)\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0438\u00a0<code>{\"0$:ParentId\":null}<\/code>\u00a0\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c JSON, \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0434\u043e\u0435\u0437\u0436\u0430\u0435\u0442 \u0434\u043e\u00a0<code>push<\/code>\u00a0\u0438 \u043f\u0440\u0438\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043f\u043e\u00a0<code><em>objects<\/em><\/code><em>. \u0423\u0440\u043e\u043a:\u00a0<\/em><code><em>json<\/em>each.value<\/code>\u00a0\u2014 \u043b\u043e\u0441\u0441\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u043e\u043d \u0442\u0435\u0440\u044f\u0435\u0442 \u0442\u0438\u043f (null \u2192 SQL NULL, text \u2192 \u0431\u0435\u0437 \u043a\u0430\u0432\u044b\u0447\u0435\u043a); \u0435\u0441\u043b\u0438 \u0438\u0437 \u043d\u0435\u0433\u043e \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u0443\u0435\u0448\u044c JSON, \u0434\u0435\u043b\u0430\u0439 \u044d\u0442\u043e\u00a0<strong>\u043f\u043e \u043a\u043e\u043b\u043e\u043d\u043a\u0435\u00a0<\/strong><code><strong>type<\/strong><\/code>.<\/p>\n<h4>DistinctBy: \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f\u00a0DISTINCT ON\u00a0\u0447\u0435\u0440\u0435\u0437\u00a0ROW_NUMBER()<\/h4>\n<p>\u0423 Postgres \u0435\u0441\u0442\u044c\u00a0<code>DISTINCT ON (col)<\/code>\u00a0\u2014 \u00ab\u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 col\u00bb. \u0423 SQLite \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442. \u041d\u0430 Pro \u044d\u0442\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0432\u00a0<code>ProSqlBuilder<\/code>\u00a0\u0447\u0435\u0440\u0435\u0437\u00a0<code>ROW_NUMBER()<\/code>; \u043d\u0430 Free \u043d\u0430\u0442\u0438\u0432\u043a\u0430\u00a0<code>distinct_on<\/code>\u00a0<strong>\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430<\/strong>\u00a0(\u0431\u044b\u043b \u044f\u0432\u043d\u044b\u0439 TODO), \u0438\u00a0<code>DistinctBy(e =&gt; e.Department)<\/code>\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b.<\/p>\n<p>\u0414\u043e\u0432\u043e\u0434\u0438\u043b\u0438 \u0434\u043e \u043f\u0430\u0440\u0438\u0442\u0435\u0442\u0430. \u0421\u0430\u043c\u0430\u00a0<code>pvt_build_query_sql<\/code>\u00a0\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 12-\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u00a0<code>distinct_on<\/code>\u00a0\u2014 \u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f-\u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u0447\u0438\u0442\u0430\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e 11-\u0433\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 C# \u0441\u043b\u0430\u043b, \u0430 \u043d\u0430\u0442\u0438\u0432\u043a\u0430 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0430. \u041f\u043e\u0447\u0438\u043d\u043a\u0430 \u0442\u0440\u043e\u0439\u043d\u0430\u044f:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c 12-\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u0442\u0430\u0449\u0438\u0442\u044c distinct-\u043f\u043e\u043b\u0435 \u0432 \u043f\u0438\u0432\u043e\u0442.<\/strong>\u00a0\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e \u0432 \u0444\u0438\u043b\u044c\u0442\u0440\u0435\/\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435, \u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044f\u0445 \u2192 \u043d\u0435\u0442 \u0432 CTE \u2192 \u043d\u0435 \u043f\u043e \u0447\u0435\u043c\u0443 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 distinct-\u043f\u043e\u043b\u0435 \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439 (<code>pvtCollectFields<\/code>) \u0442\u0435\u043c \u0436\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c, \u0447\u0442\u043e \u0438\u00a0<code>ORDER BY<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u00a0<\/strong><code><strong><em>ranked<\/em><\/strong><\/code><strong><em>-CTE \u0441\u00a0<\/em><\/strong><code><strong><em>ROW<\/em>NUMBER()<\/strong><\/code>\u00a0\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u00a0<code>rn=1<\/code>:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"sql\">WITH _pvt_cte AS ( ... \u043f\u0438\u0432\u043e\u0442 Department ... ),_ranked AS (  SELECT o._id AS _id,         ROW_NUMBER() OVER (PARTITION BY _pvt_cte.\"Department\" ORDER BY o._id) AS _rn  FROM _pvt_cte  JOIN _objects o ON o._id = _pvt_cte._id_object)SELECT _id FROM _ranked WHERE _rn = 1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u0438\u0437 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044f: base \u2192\u00a0<code>o.&lt;column&gt;<\/code>, prop \u2192\u00a0<code><em>pvt<\/em>cte.\"&lt;FieldName&gt;\"<\/code>\u00a0(\u043f\u0438\u0432\u043e\u0442\u043d\u0430\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0430). \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u2014 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u00a0<code>o._id<\/code>\u00a0(\u043a\u0430\u043a \u0438 \u0443 Pro). \u0412\u0441\u0451 \u044d\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f\u00a0<strong>\u0442\u043e\u043b\u044c\u043a\u043e<\/strong>\u00a0\u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438\u00a0<code>distinct_on<\/code>; \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0434\u0443\u0442 \u043f\u0440\u0435\u0436\u043d\u0438\u043c \u043f\u0443\u0442\u0451\u043c \u2014 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0438\u0441\u043a \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0430 \u0434\u043b\u044f 99% \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<hr\/>\n<h3>\u0427\u0430\u0441\u0442\u044c 4. Free vs Pro: \u0433\u0434\u0435 Pro \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043b\u0435\u0437 \u0432\u043e Free<\/h3>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e Free \u0438 Pro \u0434\u0435\u043b\u044f\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b (<code>redb.Core<\/code>), \u043d\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><strong>Free<\/strong>\u00a0\u0437\u043e\u0432\u0451\u0442\u00a0<code>get_object_json<\/code>\u00a0(\u043d\u0430\u0442\u0438\u0432\u043a\u0430) \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>Pro<\/strong>\u00a0\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432 C# (<code>ProLazyPropsLoader<\/code>,\u00a0<code>ProSqlBuilder<\/code>) \u0438\u00a0<strong>\u043d\u0438 \u0440\u0430\u0437\u0443<\/strong>\u00a0\u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0451\u0440\u0433\u0430\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u0432\u044b\u043b\u0435\u0437 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0433.\u00a0<code>DeleteSubtreeAsync<\/code>\u00a0(\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430) \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 id \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0439\u00a0<code>TreeProviderBase.CollectDescendantIds<\/code>. Pro \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u00a0<em>\u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0435<\/em>\u00a0tree-\u043c\u0435\u0442\u043e\u0434\u044b (<code>GetChildren<\/code>,\u00a0<code>GetPolymorphicChildren<\/code>,\u00a0<code>LoadDynamicObject<\/code>) \u043d\u0430 C#-\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u2014 \u0430 \u0432\u043e\u0442\u00a0<code>CollectDescendantIds<\/code>\u00a0<strong>\u043d\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b<\/strong>, \u0438 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0440\u0435\u0446\u0435\u043f\u0442 \u0441\u00a0<code>get_object_json<\/code>:<\/p>\n<pre><code class=\"sql\">-- Tree_SelectPolymorphicChildren \u2014 \u0440\u0435\u0446\u0435\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0451\u0440\u0433\u0430\u043b \u043d\u0430\u0442\u0438\u0432\u043a\u0443:SELECT o._id as ObjectId, o._id_scheme as SchemeId, get_object_json(o._id, 1) as JsonDataFROM _objects o WHERE o._id_parent = $1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 PG\/MSSql \u044d\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u043b\u0447\u0430:\u00a0<code>get_object_json<\/code>\u00a0\u0442\u0430\u043c \u2014\u00a0<strong>\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0435\u0441\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u0442\u0438\u0440\u0435<\/strong>. \u041d\u0430\u00a0<strong>SQLite Pro<\/strong>\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0442 (\u043d\u0430\u0442\u0438\u0432\u043a\u0443 Pro \u043d\u0435 \u0433\u0440\u0443\u0437\u0438\u0442) \u2192 \u0436\u0451\u0441\u0442\u043a\u0438\u0439 \u043a\u0440\u0435\u0448\u00a0<code>no such function: get_object_json<\/code>. \u0410 \u043d\u0430 PG\/MSSql Pro \u0431\u044b\u043b\u043e \u0442\u0438\u0445\u043e\u0435 \u0440\u0430\u0441\u0442\u043e\u0447\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u043b\u043d\u044b\u0439 JSON \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u2014 \u0440\u0430\u0434\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c JSON \u0438 \u0432\u0437\u044f\u0442\u044c\u00a0<code>_id<\/code>.<\/p>\n<p>\u0424\u0438\u043a\u0441 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Pro-override (\u044d\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u0431\u044b \u0431\u0430\u0437\u0443 \u0434\u0451\u0440\u0433\u0430\u0442\u044c\u00a0<code>get_object_json<\/code>\u00a0\u0440\u0430\u0434\u0438 \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 JSON \u043d\u0435 \u043d\u0443\u0436\u0435\u043d), \u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b\u00a0<strong>\u0443\u0431\u0440\u0430\u0442\u044c JSON \u0438\u0437 \u0441\u0430\u043c\u043e\u0433\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430<\/strong>: \u0435\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0438\u0441\u043e\u043a id. \u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 id-only \u0440\u0435\u0446\u0435\u043f\u0442 \u0432\u043e \u0432\u0441\u0435 \u0442\u0440\u0438 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>\/\/ ISqlDialect + PostgreSqlDialect \/ MsSqlDialect \/ SqliteDialect:public string Tree_SelectChildrenIds() =&gt;    \"SELECT o._id FROM _objects o WHERE o._id_parent = $1 ORDER BY o._name, o._id\";<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code>\/\/ CollectDescendantIds \u2014 \u0431\u044b\u043b\u043e QueryAsync&lt;ChildObjectInfo&gt;(Tree_SelectPolymorphicChildren), \u0441\u0442\u0430\u043b\u043e:var childIds = await Context.QueryScalarListAsync&lt;long&gt;(Sql.Tree_SelectChildrenIds(), parentId);foreach (var childId in childIds) { ids.Add(childId); await CollectDescendantIds(childId, ids, ...); }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0442\u0435\u0447\u044c \u0437\u0430\u043a\u0440\u044b\u0442\u0430\u00a0<strong>\u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u0440\u043e\u0432<\/strong>: Free \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043b\u0438\u0448\u043d\u0438\u0439 JSON \u0440\u0430\u0434\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 id, Pro \u043d\u0435 \u043b\u0435\u0437\u0435\u0442 \u0432 \u043d\u0430\u0442\u0438\u0432\u043a\u0443, PG\/MSSql Pro \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u044e\u0442 \u0437\u0440\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c. \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 Pro\u00a0<code>get_object_json<\/code>\u00a0\u0442\u0435\u043f\u0435\u0440\u044c \u0440\u043e\u0432\u043d\u043e \u043d\u043e\u043b\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u0418, \u043a\u0441\u0442\u0430\u0442\u0438,\u00a0<strong>SQLite Pro \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u043c<\/strong>\u00a0\u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0442\u0435\u0447\u0435\u043a: \u043e\u043d \u043a\u0440\u0435\u0448\u0438\u0442\u0441\u044f \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0438\u0437 Pro \u2014 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430 PG\/MSSql \u043c\u043e\u043b\u0447\u0438\u0442.<\/p>\n<h4>\u0417\u0430\u043e\u0434\u043d\u043e:\u00a0DeleteSubtree\u00a0\u0438 \u043a\u0430\u0441\u043a\u0430\u0434<\/h4>\n<p>\u0422\u043e\u0442 \u0436\u0435\u00a0<code>DeleteSubtree<\/code>\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0445. \u041d\u0430 SQLite \u0432 \u0441\u0445\u0435\u043c\u0435 \u0435\u0441\u0442\u044c\u00a0<code>FK <em>id<\/em>parent ... ON DELETE CASCADE<\/code>\u00a0\u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0448\u044c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f, \u0434\u0435\u0442\u0438 \u0443\u0445\u043e\u0434\u044f\u0442 \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u043c. \u0410\u00a0<code>changes()<\/code>\u00a0(rows-affected) \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e-\u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\u00a0<strong>\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442<\/strong>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443\u00a0<code>DELETE WHERE <em>id IN (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c, \u0434\u0435\u0442\u0438)<\/em><\/code><em>\u00a0\u043c\u043e\u0433 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00a0<\/em><code><em>1<\/em><\/code><em>\u00a0(\u0442\u043e\u043b\u044c\u043a\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0434\u0435\u0442\u0438 \u2014 \u043a\u0430\u0441\u043a\u0430\u0434\u043e\u043c). \u041f\u043e\u0447\u0438\u043d\u0438\u043b\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u043e\u0439: \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0<\/em><strong><em>\u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430<\/em><\/strong><em>\u00a0(<\/em><code><em>objectIds.Count<\/em><\/code><em>), \u0430 \u043d\u0435 cascade-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 rows-affected. \u041d\u0430 PG\/MSSql (\u0433\u0434\u0435 \u043a\u0430\u0441\u043a\u0430\u0434\u0430 \u043d\u0430\u00a0<\/em><code>id_parent<\/code>\u00a0\u043d\u0435\u0442) \u044d\u0442\u043e \u0442\u043e \u0436\u0435 \u0447\u0438\u0441\u043b\u043e \u2014 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f.<\/p>\n<h4>Bool \u2014 \u044d\u0442\u043e INTEGER<\/h4>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u043c\u0435\u043b\u043e\u0447\u044c, \u0432\u0441\u043f\u043b\u044b\u0432\u0448\u0430\u044f \u0432 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430\u0445. SQLite \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0431\u0443\u043b\u0435\u0432\u0430 \u0442\u0438\u043f\u0430 \u2014 \u0445\u0440\u0430\u043d\u0438\u0442\u00a0<code>0<\/code>\/<code>1<\/code>\u00a0\u043a\u0430\u043a INTEGER. \u0412 \u043f\u0438\u0432\u043e\u0442\u0435\/\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 bool \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 \u0432 \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u043a\u0430\u043a\u00a0<strong>JSON-\u0447\u0438\u0441\u043b\u043e<\/strong>, \u0430 \u0432\u0435\u0442\u043a\u0430\u00a0<code>bool<\/code>\u00a0\u0432\u00a0<code>JsonValueConverter<\/code>\u00a0\u043b\u043e\u0432\u0438\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e\u00a0<code>true<\/code>\/\u0441\u0442\u0440\u043e\u043a\u0443 \u2192 \u0447\u0438\u0441\u043b\u043e\u00a0<code>1<\/code>\u00a0\u0434\u0430\u0432\u0430\u043b\u043e\u00a0<code>false<\/code>. \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e bool-\u043a\u043b\u044e\u0447\u0443 \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u043b\u0430\u0441\u044c (\u0432\u0441\u0435 \u00abfalse\u00bb). \u0424\u0438\u043a\u0441 \u2014 \u043f\u0440\u0438\u043d\u044f\u0442\u044c Number \u0432 bool-\u0432\u0435\u0442\u043a\u0435:<\/p>\n<pre><code>Type t when t == typeof(bool) =&gt; elem.ValueKind == JsonValueKind.True    || (elem.ValueKind == JsonValueKind.Number &amp;&amp; elem.TryGetDouble(out var bn) &amp;&amp; bn != 0)    || (elem.ValueKind == JsonValueKind.String &amp;&amp; bool.TryParse(elem.GetString(), out var bl) &amp;&amp; bl),<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>PG\/MSSql \u0448\u043b\u044e\u0442\u00a0<code>true<\/code>\/<code>false<\/code>\u00a0\u2014 \u0438\u0445 \u043d\u0435 \u0437\u0430\u0434\u0435\u0432\u0430\u0435\u0442.<\/p>\n<hr\/>\n<h3>\u0427\u0430\u0441\u0442\u044c 5. \u041a\u0430\u043a \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443<\/h3>\n<p>\u042d\u0442\u043e \u043d\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043b\u0435\u0436\u0430\u0442 \u0434\u0432\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u0441\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<p><code><strong>redb.Examples<\/strong><\/code>\u00a0\u2014 ~150 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0<strong>\u043b\u044e\u0431\u043e\u043c<\/strong>\u00a0\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f SQLite:<\/p>\n<pre><code class=\"bash\">dotnet run --project redb.Examples -- E021 E146 E148   # \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u0434\u0430\u0442\u0435, \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u044b, \u043e\u043a\u043e\u043d\u043d\u044b\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435\u00a0<code>AddRedb<\/code>\/<code>AddRedbPro<\/code>\u00a0+\u00a0<code>UseSqlite<\/code>\u00a0\u2014 \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043d\u0430\u0431\u043e\u0440 \u0431\u0435\u0436\u0438\u0442 \u0432\u0436\u0438\u0432\u0443\u044e \u043d\u0430 SQLite Free \u0438\u043b\u0438 Pro. \u0422\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u043f\u043e\u0439\u0434\u0451\u0442 \u043d\u0430 Postgres\/MSSql \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p><code><strong>redb.CLI<\/strong><\/code>\u00a0\u2014 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 .NET-\u0442\u0443\u043b \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u043e\u0439 \u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 sqlite \u0432\u043e \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445:<\/p>\n<pre><code class=\"bash\">redb schema -p sqlite -o redb_sqlite.sql            # \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0435\u0441\u044c SQL-\u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0445\u0435\u043c\u044b (\u0434\u043b\u044f \u0440\u0435\u0432\u044c\u044e\/CI)redb init   -p sqlite -c \"Data Source=app.db\"       # \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043f\u0443\u0441\u0442\u043e\u0439 \u0431\u0430\u0437\u0435redb export -p sqlite -c \"Data Source=app.db\" -o data.redb --compressredb import -p sqlite -c \"Data Source=app.db\" -i data.redb --clean<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014\u00a0<strong>\u0434\u043e\u0432\u0435\u0440\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u0430\u043c\u0438<\/strong>. SQLite Free \u0438 Pro \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440\u00a0<strong>\u043f\u043e 200\/200<\/strong>\u00a0\u2014 \u0442\u043e\u0442 \u0436\u0435, \u0447\u0442\u043e \u0433\u0435\u0439\u0442\u0438\u0442 Postgres \u0438 MSSql. \u0414\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u044d\u0442\u043e \u0432\u0435\u0441\u043e\u043c\u0435\u0435 \u043b\u044e\u0431\u044b\u0445 \u0441\u043b\u043e\u0432: \u0442\u043e\u0442 \u0436\u0435 \u043d\u0430\u0431\u043e\u0440, \u0442\u0430 \u0436\u0435 \u043f\u043b\u0430\u043d\u043a\u0430.<\/p>\n<h4>\u0411\u043e\u0435\u0432\u0430\u044f \u0431\u0430\u0439\u043a\u0430 \u21164: CLI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u00ab\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u00bb sqlite, \u043d\u043e \u043c\u043e\u043b\u0447\u0430 \u2014 \u043d\u0435\u0442<\/h4>\n<p>\u0413\u043e\u0442\u043e\u0432\u044f \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u00a0<code>redb schema -p sqlite<\/code>\u00a0\u2014 \u0438 \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u0438\u043d\u0443 \u0432 \u0442\u0443\u043b\u0438\u043d\u0433\u0435. \u041a\u043e\u0434\u00a0<code>redb.CLI<\/code>\u00a0sqlite\u00a0<strong>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b<\/strong>: \u0431\u044b\u043b \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439\u00a0<code>SqliteProvider<\/code>, \u0444\u0430\u0431\u0440\u0438\u043a\u0430\u00a0<code>ProviderFactory.Create(\"sqlite\")<\/code>, \u0440\u0435\u0441\u0443\u0440\u0441 \u0441\u0445\u0435\u043c\u044b\u00a0<code>redbSqlite.sql<\/code>. \u0410 csproj \u2014 \u043d\u0435\u0442:<\/p>\n<pre><code class=\"xml\">&lt;!-- redb.CLI.csproj \u2014 \u0442\u044f\u043d\u0443\u043b \u0434\u0432\u0438\u0436\u043e\u043a \u0438\u0437 NuGet \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438: --&gt;&lt;PackageReference Include=\"redb.SQLite\" Version=\"1.2.*\" \/&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>1.2.*<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u00a0<strong>\u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e \u0432\u043e\u043e\u0431\u0449\u0435<\/strong>\u00a0(\u043e\u043d \u043d\u043e\u0432\u044b\u0439, \u0441 3.2.1). \u0422\u043e \u0435\u0441\u0442\u044c\u00a0<code>typeof(redb.SQLite.RedbService).Assembly<\/code>\u00a0\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441\u00a0<code>redbSqlite.sql<\/code>\u00a0\u0440\u0435\u0437\u043e\u043b\u0432\u0438\u043b\u0438\u0441\u044c \u0432 \u0441\u0431\u043e\u0440\u043a\u0443, \u0433\u0434\u0435 \u0438\u0445 \u043d\u0435\u0442, \u0438 \u043b\u044e\u0431\u0430\u044f\u00a0<code>-p sqlite<\/code>-\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0442\u0438\u0445\u043e \u0440\u0430\u0437\u044a\u0435\u0437\u0436\u0430\u043b\u0430\u0441\u044c \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u0424\u0438\u043a\u0441 \u2014 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b (\u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432\u00a0<code>redb.Examples<\/code>):<\/p>\n<pre><code class=\"xml\">&lt;ProjectReference Include=\"..\\redb.SQLite\\redb.SQLite.csproj\" \/&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0440\u0430\u043b\u044c \u0438\u0437 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0435\u0440\u0438\u0438, \u0447\u0442\u043e \u0438\u00a0<code>%%<\/code>-\u0431\u0430\u0439\u043a\u0430:\u00a0<strong>\u00ab\u0432 \u043a\u043e\u0434\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0435\u0441\u0442\u044c\u00bb \u2260 \u00ab\u0441\u0431\u043e\u0440\u043a\u0430 \u0435\u0451 \u0432\u0438\u0434\u0438\u0442\u00bb.<\/strong>\u00a0\u0412\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u0438\u043d \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430, \u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u043f\u0438\u043d \u043b\u043e\u043c\u0430\u0435\u0442 \u0444\u0438\u0447\u0443 \u0442\u0430\u043a \u0436\u0435 \u0433\u043b\u0443\u0445\u043e, \u043a\u0430\u043a \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u0432 SQL. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u2014 \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u043c \u0441\u0430\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:\u00a0<code>redb schema -p sqlite<\/code>\u00a0\u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0441\u0445\u0435\u043c\u0443 (REAL Julian,\u00a0<code>_DateTimeOffset REAL<\/code>), \u0430 \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043f\u0443\u0441\u0442\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0435.<\/p>\n<hr\/>\n<h3>\u0427\u0430\u0441\u0442\u044c 6. \u0413\u0440\u0430\u0431\u043b\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u0435 \u0432\u044b<\/h3>\n<p>\u0421\u0435\u0440\u0438\u044f \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u043f\u0440\u043e \u00ab\u0447\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0438 \u043e\u0431\u043e \u0447\u0442\u043e \u0441\u043f\u043e\u0442\u043a\u043d\u0451\u0442\u0435\u0441\u044c\u00bb, \u0442\u0430\u043a \u0447\u0442\u043e \u0431\u0435\u0437 \u043f\u0440\u0438\u0443\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u0443\u0442\u044c \u043a\u00a0<\/strong><code><strong>.db<\/strong><\/code><strong>\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.<\/strong>\u00a0\u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 (<code>Data Source=app.db<\/code>) \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u00a0<strong>cwd \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430<\/strong>, \u0430 \u043d\u0435 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u042f \u0441\u0430\u043c \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432:\u00a0<code>dotnet run<\/code>\u00a0\u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u043f\u0438\u0441\u0430\u043b \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0438 \u0442\u0435\u0441\u0442\u044b \u00ab\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438\/\u043f\u0430\u0434\u0430\u043b\u0438\u00bb \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u0439 \u0411\u0414. \u0411\u0435\u0440\u0438\u0442\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0438\u043b\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0439\u0442\u0435 cwd.<\/p>\n<\/li>\n<li>\n<p><code><strong>:memory:<\/strong><\/code><strong>\u00a0\u2014 per-connection.<\/strong>\u00a0\u0427\u0442\u043e\u0431\u044b \u043f\u0443\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0432\u0438\u0434\u0435\u043b \u043e\u0434\u043d\u0443 in-memory \u0431\u0430\u0437\u0443, \u043d\u0443\u0436\u0435\u043d\u00a0<code>Mode=Memory;Cache=Shared<\/code>\u00a0\u043f\u043b\u044e\u0441 \u043e\u0434\u0438\u043d\u00a0<strong>\u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439<\/strong>\u00a0\u043a\u043e\u043d\u043d\u0435\u043a\u0442. \u042d\u0442\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b SQLite, \u043d\u0435 redb: \u0437\u0430\u043a\u0440\u044b\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442 \u2014 \u0431\u0430\u0437\u0430 \u0438\u0441\u043f\u0430\u0440\u0438\u043b\u0430\u0441\u044c.<\/p>\n<\/li>\n<li>\n<p><code><strong>NUMERIC<\/strong><\/code><strong>\u00a0\u2192\u00a0<\/strong><code><strong>REAL<\/strong><\/code><strong>\u00a0\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/strong>\u00a0\u0411\u044b\u0441\u0442\u0440\u043e, \u043d\u043e \u043b\u043e\u0441\u0441\u043e\u0432\u043e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 double. \u0422\u043e\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0<code>TEXT<\/code>\u00a0\u2014 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430. \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u0441\u043b\u0430\u0431\u043e\u0435 \u043c\u0435\u0441\u0442\u043e SQLite.<\/p>\n<\/li>\n<li>\n<p><strong>SQLite \u2014 single-writer.<\/strong>\u00a0\u041e\u0434\u0438\u043d \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0430\u0439\u043b; \u043d\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c redb \u0441\u0442\u0430\u0432\u0438\u0442\u00a0<code>busy_timeout<\/code>, \u043d\u043e Postgres-\u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430 \u0436\u0434\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e. \u0414\u043b\u044f embedded\/\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u2014 \u043d\u043e\u0440\u043c\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 Free \u0438\u0434\u0443\u0442 \u043f\u043e\u0434 Windows x64, Linux x64 \u0438 Linux arm64.<\/strong>\u00a0\u0412\u0441\u0435 \u0442\u0440\u0438 \u043b\u0435\u0436\u0430\u0442 \u0432\u00a0<code>runtimes\/&lt;rid&gt;\/native\/<\/code>\u00a0\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043e framework-dependent \u0441\u0431\u043e\u0440\u043a\u0438 \u0447\u0435\u0440\u0435\u0437\u00a0<code>buildTransitive<\/code>\u00a0.targets \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u043f\u043e \u044f\u0432\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0432\u0430\u0448 output, \u0430 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0435\u0437 RID NuGet \u0441\u0430\u043c\u00a0<code>runtimes\/<\/code>\u00a0\u043d\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442. macOS (<code>osx-x64<\/code>\/<code>osx-arm64<\/code>\u00a0<code>.dylib<\/code>) \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 CMake-\u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 macOS-\u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u043b, \u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 CI-\u043c\u0430\u0442\u0440\u0438\u0446\u0430.\u00a0<strong>\u0423 Pro \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0442 \u2014 \u043e\u043d \u0443\u0436\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u0435\u0437\u0434\u0435<\/strong>, \u0438 \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e WASM\/\u043c\u043e\u0431\u0438\u043b\u043a\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p><code><strong>bool<\/strong><\/code><strong>\u00a0\u0432 \u0441\u044b\u0440\u043e\u043c \u0432\u0438\u0434\u0435 \u2014\u00a0<\/strong><code><strong>0<\/strong><\/code><strong>\/<\/strong><code><strong>1<\/strong><\/code><strong>.<\/strong>\u00a0\u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043f\u0440\u0438 \u0434\u0435\u0431\u0430\u0433\u0435\u00a0<code><em>Boolean<\/em><\/code><em>\/<\/em><code>value_bool<\/code>:\u00a0<code>true<\/code>\u00a0\u043b\u0435\u0436\u0438\u0442 \u043a\u0430\u043a\u00a0<code>1<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u043d\u0435 \u0442\u043e\u0440\u0447\u0438\u0442 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u2014 \u043d\u043e \u0432 \u0434\u0435\u0431\u0430\u0433\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u0432\u0435\u0447\u0435\u0440.<\/p>\n<hr\/>\n<h3>\u0427\u0430\u0441\u0442\u044c 7. Pro \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u043a\u0435 \u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u2014 \u0438 \u0434\u0430, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e<\/h3>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0441\u044c \u043a \u0442\u043e\u043c\u0443, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u0432\u0435\u0441\u044c SQLite \u0438 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u0441\u044f.<\/p>\n<p>\u041f\u0438\u0448\u0435\u0442\u0435\u00a0<strong>Blazor WebAssembly, MAUI \u0438\u043b\u0438 standalone-\u043a\u043b\u0438\u0435\u043d\u0442<\/strong>\u00a0\u2014 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d\u00a0<strong>SQLite Pro<\/strong>: \u0447\u0438\u0441\u0442\u044b\u0439 C#, \u043d\u0430\u0442\u0438\u0432\u043a\u0443 \u043d\u0435 \u0433\u0440\u0443\u0437\u0438\u0442, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0439 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435 \u0438 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435. \u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 LINQ-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0418 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u044f\u043c\u043e:\u00a0<strong>Pro \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u2014 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439.<\/strong><\/p>\n<ul>\n<li>\n<p>\u0418\u0434\u0451\u0442\u0435 \u043d\u0430\u00a0<a href=\"http:\/\/redbase.app\" rel=\"noopener noreferrer nofollow\">redbase.app<\/a>\u00a0(\u043e\u043d \u0436\u0435\u00a0<a href=\"http:\/\/redb.ru\" rel=\"noopener noreferrer nofollow\">redb.ru<\/a>), \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0435\u0441\u044c \u0438\u00a0<strong>\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u043b\u044e\u0447\u0430 \u043d\u0430 \u043f\u043e\u0447\u0442\u0443<\/strong>\u00a0\u2014 \u0432 \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u044e\u0442\u00a0<strong>\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0445\/\u043f\u043b\u0430\u0442\u0451\u0436\u043d\u044b\u0445 \u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432.<\/strong>\u00a0\u041a\u0430\u0440\u0442\u0443 \u043d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u2014 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432\u044b\u0434\u0430\u0447\u0438 \u043a\u043b\u044e\u0447\u0430, \u0430 \u043d\u0435 \u0432\u043e\u0440\u043e\u043d\u043a\u0430 \u043f\u0440\u043e\u0434\u0430\u0436.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043b\u044e\u0447 \u2014 \u0432\u00a0<code>.WithLicense(...)<\/code>, \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u0442\u0430\u043c \u0436\u0435, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u0430\u0440\u044c\u0435\u0440 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u2014 \u043d\u0443\u043b\u0435\u0432\u043e\u0439.<\/p>\n<hr\/>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p>SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b \u043d\u0430\u0441 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0435 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u0438 \u043f\u043e\u0439\u043c\u0430\u0442\u044c \u0442\u0440\u0438 \u0431\u0430\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043f\u0440\u043e\u0434\u0435 \u0441\u0442\u043e\u0438\u043b\u0438 \u0431\u044b \u0434\u043e\u0440\u043e\u0436\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0435\u0432\u044c\u044e.<\/p>\n<p>\u041d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0432\u0435\u0449\u0438: \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0435\u0441\u044c \u0434\u0432\u0438\u0436\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u00a0<strong>C-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435<\/strong>\u00a0\u0442\u0430\u043c, \u0433\u0434\u0435 \u0443 \u0431\u0430\u0437\u044b \u043d\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u043a (\u0438 \u0433\u0434\u0435\u00a0<code>%<\/code>\u00a0\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u043c\u0430\u0435\u0442\u00a0<code>mprintf<\/code>), \u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u00a0<strong>\u00ab\u043a\u0430\u043a \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u0442\u0443\u00bb<\/strong>\u00a0\u0434\u043b\u044f \u0431\u0430\u0437\u044b, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u0438\u043f\u0430 \u00ab\u0434\u0430\u0442\u0430\u00bb \u043d\u0435\u0442 \u2014 REAL Julian \u0432 UTC, sargable-\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f,\u00a0<code>julianday()<\/code>\u00a0\u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430, \u0438 \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u0443\u043a \u0432 \u044f\u0434\u0440\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0442\u0435\u0447\u043a\u0438 SQLite-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438.<\/p>\n<p>\u0411\u0430\u0433\u0438: \u0442\u0438\u0445\u043e \u0442\u0435\u0440\u044f\u0432\u0448\u0438\u0439\u0441\u044f\u00a0<code>IS NULL<\/code>\u00a0\u0432 \u043c\u0443\u043b\u044c\u0442\u0438-\u043a\u043b\u044e\u0447\u0435\u0432\u043e\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0435 (<code>json_each.value<\/code>\u00a0\u043b\u043e\u0441\u0441\u043e\u0432 \u043f\u043e \u0442\u0438\u043f\u0443),\u00a0<code>DISTINCT ON<\/code>\u00a0\u0447\u0435\u0440\u0435\u0437\u00a0<code>ROW_NUMBER()<\/code>\u00a0\u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0433\u043d\u043e\u0440\u0430, \u0438 Pro, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043b\u0435\u0437\u0443\u0449\u0438\u0439 \u0432 Free-\u0444\u0443\u043d\u043a\u0446\u0438\u044e\u00a0<code>get_object_json<\/code>\u00a0\u043d\u0430 \u043f\u0443\u0442\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430.<\/p>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u2014 \u0440\u043e\u0432\u043d\u043e \u0442\u0435 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u00ab\u043e\u0434\u0438\u043d LINQ \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0431\u0430\u0437\u00bb \u043b\u0438\u0431\u043e \u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u0434\u0430\u0440, \u043b\u0438\u0431\u043e \u0442\u0435\u0447\u0451\u0442. \u0423 \u043d\u0430\u0441 \u0434\u0435\u0440\u0436\u0438\u0442: Free \u0438 Pro \u0437\u0435\u043b\u0451\u043d\u044b\u0435 \u043f\u043e\u00a0<strong>200\/200<\/strong>\u00a0\u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043d\u0430\u0431\u043e\u0440\u0435, \u0447\u0442\u043e \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u044b, \u0430 \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e\u00a0<code>redb.Examples<\/code>\u00a0\u0438\u00a0<code>redb.CLI<\/code>\u00a0\u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0434\u043e\u043a\u0438, \u043f\u0430\u043a\u0435\u0442\u044b \u2014\u00a0<a href=\"http:\/\/redbase.app\" rel=\"noopener noreferrer nofollow\">redbase.app<\/a>. \u0412\u0435\u0440\u0441\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u2014\u00a0<strong>3.2.1<\/strong>; \u0434\u0432\u0430 SQLite-NuGet-\u043f\u0430\u043a\u0435\u0442\u0430 (<code>redb.SQLite<\/code>\u00a0\/\u00a0<a href=\"http:\/\/redb.SQLite.Pro\" rel=\"noopener noreferrer nofollow\"><code>redb.SQLite.Pro<\/code><\/a>) \u2014\u00a0<strong>3.2.1<\/strong>\u00a0(\u0445\u043e\u0442\u0444\u0438\u043a\u0441\u00a0<code>buildTransitive<\/code>\u00a0.targets, \u0441\u043c. War story #5). \u0412\u043e\u043f\u0440\u043e\u0441\u044b, \u00ab\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043b\u0438 \u043e\u043d\u043e X \u043d\u0430 SQLite\u00bb, \u0431\u0430\u0433-\u0440\u0435\u043f\u043e\u0440\u0442\u044b \u2014 \u043d\u0435\u0441\u0438\u0442\u0435; \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0441\u0432\u0435\u0436\u0438\u0439, \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0430.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1053672\/\">https:\/\/habr.com\/ru\/articles\/1053672\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0421\u0435\u0440\u0438\u044f: redb ecosystem (\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u043e\u0441\u043b\u0435 \u0430\u043d\u043e\u043d\u0441\u0430 3.2.1)\u041e \u0447\u0451\u043c \u044d\u0442\u043e\u041a\u043e\u0433\u0434\u0430\u00a0\u0432\u044b\u0448\u0435\u043b SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 3.2.1, \u0430\u043d\u043e\u043d\u0441 \u0431\u044b\u043b \u043d\u0430 \u043f\u0430\u0440\u0443 \u0430\u0431\u0437\u0430\u0446\u0435\u0432: \u00ab\u0442\u043e\u0442 \u0436\u0435 LINQ, \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 DI\u00bb. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043d\u043e\u043d\u0441\u0430. \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u00ab\u0447\u0442\u043e \u0432\u044b\u0448\u043b\u043e\u00bb, \u0430\u00a0\u043a\u0430\u043a \u043e\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438 \u0433\u0434\u0435 \u0443 \u043d\u0430\u0441 \u043f\u043e\u0442\u0435\u043a\u043b\u043e. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e: \u043a\u0430\u043a \u0434\u0432\u0438\u0436\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 redb \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 C-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0443 \u0431\u0430\u0437\u044b \u043d\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u043a; \u043a\u0430\u043a \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c\u00a0DateTimeOffset\u00a0\u0432 \u0431\u0430\u0437\u0435, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u0442\u0438\u043f\u0430 \u00ab\u0434\u0430\u0442\u0430\u00bb; \u0438 \u0442\u0440\u0438 \u0431\u0430\u0433\u0430 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440-JSON, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c SQL \u0438 \u0444\u0438\u043a\u0441\u043e\u043c.\u042d\u0442\u043e \u0434\u043b\u0438\u043d\u043d\u043e \u0438 \u0441 \u043a\u043e\u0434\u043e\u043c. \u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u2014 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0430\u043d\u043e\u043d\u0441 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u044b\u0448\u0435. \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u00ab\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 DI\u00bb, \u2014 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435\u0441\u044c.\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u043e redb \u0432\u043f\u0435\u0440\u0432\u044b\u0435 (\u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435):redb \u2014 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f .NET \u043f\u043e\u0432\u0435\u0440\u0445 Postgres\/MSSQL: \u0431\u0435\u0437 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439, \u0431\u0435\u0437 Include, \u0441 \u043f\u043e\u043b\u043d\u044b\u043c LINQ\u00a0\u2014 \u0447\u0442\u043e \u044d\u0442\u043e \u0438 \u0437\u0430\u0447\u0435\u043c.REDB \u0438\u0437\u043d\u0443\u0442\u0440\u0438, \u0441\u0442\u0430\u0442\u044c\u044f 1: 13 \u0442\u0430\u0431\u043b\u0438\u0446, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0451\u00a0\u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.\u00a0\u041a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438:\u00a0SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0443 \u0435\u0451 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043e\u0434\u0438\u043d-\u0432-\u043e\u0434\u0438\u043d.REDB: \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u2014 \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u00a0\u2014 \u0438\u043d\u0434\u0435\u043a\u0441\u044b.SQLite-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0434\u043b\u044f RedBase \u2014 \u0430\u043d\u043e\u043d\u0441 3.2.1\u00a0\u2014 \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u0433\u043b\u0443\u0431\u044c.\u0418 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c\u0441\u044f.\u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u043f\u0440\u043e \u0442\u0435\u0440\u043c\u0438\u043d.\u00a0\u0414\u0430, \u0443 redb \u00ab\u0433\u0438\u0431\u043a\u0430\u044f\u00bb \u043c\u043e\u0434\u0435\u043b\u044c: \u043a\u043b\u0430\u0441\u0441 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u0435\u0442, \u044d\u0442\u043e\u00a0\u043d\u0435 EAV\u00a0\u0432 \u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0432 \u043a\u0430\u043a\u043e\u043c \u044d\u0442\u043e \u0441\u043b\u043e\u0432\u043e \u0431\u0440\u043e\u0441\u0430\u044e\u0442 \u043a\u0430\u043a \u0440\u0443\u0433\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e. \u0412 \u0431\u0430\u0437\u0435 redb \u043b\u0435\u0436\u0438\u0442\u00a0RTTI\u00a0\u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u0438\u043f\u0430\u0445: \u0441\u0445\u0435\u043c\u044b, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u0438\u043f\u044b \u043f\u043e\u043b\u0435\u0439, \u0441\u0432\u044f\u0437\u0438. \u0411\u0414\u00a0\u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0EmployeeProps.HireDate\u00a0\u2014 \u044d\u0442\u043e\u00a0DateTime, \u0447\u0442\u043e\u00a0Contacts\u00a0\u2014 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430\u00a0CurrentProject\u00a0\u2014 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0445\u0435\u043c\u0443. \u042d\u0442\u043e \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0430 \u043d\u0435 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0439\u0441\u044f \u0441\u0430\u043c\u00bb. \u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, \u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0431\u044b \u2014 \u0438\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0438\u043b\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0442.\u0412\u0442\u043e\u0440\u043e\u0439 \u2014 \u043f\u0440\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0439.\u00a0redb \u2014 \u0434\u043b\u044f\u00a0\u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043b\u0430\u0441\u0441\u043e\u0432: \u0433\u0440\u0430\u0444\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u0441\u0441\u044b\u043b\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u0445\u0435\u043c\u0430\u043c\u0438, \u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0421\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e\u00a0\u043f\u043b\u043e\u0441\u043a\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\u00a0\u2014 \u043f\u043e\u0442\u043e\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044e \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u2014 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u044d\u0442\u043e\u00a0\u0430\u043d\u0442\u0438\u043f\u0430\u0442\u0442\u0435\u0440\u043d. \u041f\u043e\u0434 \u0442\u0430\u043a\u043e\u0435 \u0435\u0441\u0442\u044c time-series \u0438 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u044b\u0435 \u0431\u0430\u0437\u044b; redb \u043f\u043b\u0430\u0442\u0438\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0438 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u043e\u0433\u0430\u0442\u044b\u0435 \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0435, \u0430 \u043d\u0435 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0434\u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430\u00a0(timestamp, value)\u00a0\u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u044b \u0441\u0442\u0440\u043e\u043a. \u041a\u043e\u0440\u043e\u0442\u043a\u043e: redb \u0441\u0438\u043b\u0451\u043d \u0442\u0430\u043c, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c\u00a0\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0434\u043e\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c.\u0427\u0430\u0441\u0442\u044c 0. \u0420\u0430\u0437\u0432\u0438\u043b\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435\u0423 SQLite\u00a0\u043d\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430. \u041d\u0438 PL\/pgSQL, \u043d\u0438 T-SQL \u2014 \u043d\u0438\u0447\u0435\u0433\u043e, \u0432\u043e \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u0410 \u00ab\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439\u00bb \u0442\u0438\u0440 redb \u043d\u0430 Postgres \u0438 MSSql \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a: \u0442\u044f\u0436\u0451\u043b\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0435\u0440\u0438\u044f (\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, soft-delete, view \u043f\u0440\u0430\u0432) \u0436\u0438\u0432\u0451\u0442\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 \u0411\u0414\u00a0\u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u0430 Free\/Pro: \u0433\u0434\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f JSON \u0438 \u043a\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0442 SQL.\u0418\u0437 \u00ab\u043d\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u043a\u00bb \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0440\u043e\u0432\u043d\u043e \u0434\u0432\u0430 \u043f\u0443\u0442\u0438, \u0438 \u043c\u044b \u043f\u043e\u0448\u043b\u0438 \u043e\u0431\u043e\u0438\u043c\u0438 \u2014 \u043d\u0430 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u0440\u0430:Pro \u2014 \u0447\u0438\u0441\u0442\u044b\u0439 C#.\u00a0SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u00a0ProSqlBuilder\u00a0\u0432 \u043a\u043e\u0434\u0435, props \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435,\u00a0\u043d\u043e\u043b\u044c\u00a0\u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0411\u0414. \u0421\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c\u00a0Microsoft.Data.Sqlite\u00a0\u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u044f\u00a0Blazor WebAssembly\u00a0\u0438\u00a0\u043c\u043e\u0431\u0438\u043b\u043a\u0438 (MAUI\/iOS\/Android), \u0433\u0434\u0435 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 SQLite \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435.Free \u2014 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 C-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435.\u00a0\u0422\u043e\u0442 \u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434, \u0447\u0442\u043e \u043d\u0430 Postgres\/MSSql: \u0434\u0432\u0438\u0436\u043e\u043a \u0436\u0438\u0432\u0451\u0442\u00a0\u0432 \u0431\u0430\u0437\u0435. \u041d\u0430 SQLite \u00ab\u0432 \u0431\u0430\u0437\u0435\u00bb \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 C (redb.dll\u00a0\/\u00a0.so\u00a0\/\u00a0.dylib) \u043f\u043e\u0432\u0435\u0440\u0445\u00a0sqlite3ext.h. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434: \u0434\u0435\u0441\u043a\u0442\u043e\u043f, \u0441\u0435\u0440\u0432\u0435\u0440, CI \u2014 \u0438 \u044d\u0442\u043e \u0436\u0435 \u0434\u0451\u0440\u043d\u0435\u0442 \u043d\u0435-.NET \u0445\u043e\u0441\u0442 (Python,\u00a0sqlite3\u00a0CLI), \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 redb \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.\u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u043e\u0431\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u043e-\u043a\u0440\u0443\u043f\u043d\u043e\u043c\u0443. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0442\u0438\u0432\u043a\u0430 (\u043e\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435), \u043f\u043e\u0442\u043e\u043c \u0434\u0430\u0442\u0430 (\u043e\u043d\u0430 \u0432\u0430\u0436\u043d\u0435\u0435), \u043f\u043e\u0442\u043e\u043c \u0431\u0430\u0433\u0438, \u043f\u043e\u0442\u043e\u043c \u0433\u0440\u0430\u0431\u043b\u0438.\u0427\u0430\u0441\u0442\u044c 0.5. \u0427\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440:\u00a0objects\u00a0\u0438\u00a0values\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u044b\u0440\u044f\u0442\u044c \u0432 \u043d\u0430\u0442\u0438\u0432\u043a\u0443 \u2014 \u0447\u0442\u043e \u043e\u043d\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442. \u041c\u043e\u0434\u0435\u043b\u044c redb \u2014 \u044d\u0442\u043e ~13 \u0442\u0430\u0431\u043b\u0438\u0446 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u2014 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab13 \u0442\u0430\u0431\u043b\u0438\u0446\u00bb), \u043d\u043e \u0434\u043b\u044f SQLite-\u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u0441\u0443\u0449\u0438\u0445 \u0434\u0432\u0435, \u0438 \u043e\u0431\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043a\u0430-\u0432-\u043a\u043e\u043b\u043e\u043d\u043a\u0443._objects\u00a0\u2014 \u00ab\u0448\u0430\u043f\u043a\u0430\u00bb \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430: \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u0434\u0435\u0440\u0435\u0432\u043e, \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435, \u0434\u0430\u0442\u044b, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0445\u0435\u043c\u0443 (\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0442\u0438\u043f):CREATE TABLE _objects(    _id             INTEGER NOT NULL PRIMARY KEY,    _id_parent      INTEGER NULL,            &#8212; \u0434\u0435\u0440\u0435\u0432\u043e (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c)    _id_scheme      INTEGER NOT NULL,        &#8212; RTTI: \u043a\u0430\u043a\u043e\u0433\u043e \u041a\u041b\u0410\u0421\u0421\u0410 \u043e\u0431\u044a\u0435\u043a\u0442    _id_owner       INTEGER NOT NULL,    _id_who_change  INTEGER NOT NULL,    _date_create    REAL    NOT NULL DEFAULT (julianday(&#8216;now&#8217;)),  &#8212; UTC Julian day (REAL)    _date_modify    REAL    NOT NULL DEFAULT (julianday(&#8216;now&#8217;)),  &#8212; UTC Julian day (REAL)    _name           TEXT    NULL,    _hash           TEXT    NULL,            &#8212; \u0445\u044d\u0448 \u0441\u043e\u0441\u0442\u0430\u0432\u0430 \u043f\u0440\u043e\u043f\u0441\u043e\u0432 (\u0434\u043b\u044f \u0434\u0435\u043b\u044c\u0442\u044b\/\u043a\u044d\u0448\u0430)    &#8212; \u0441\u043b\u043e\u0442\u044b \u0434\u043b\u044f RedbPrimitive&lt;T&gt; (\u043a\u043e\u0433\u0434\u0430 Props \u2014 \u044d\u0442\u043e \u0441\u0430\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432, \u0431\u0435\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b)    _value_long     INTEGER NULL,    _value_string   TEXT    NULL,    _value_bool     INTEGER NULL,            &#8212; bool = 0\/1    _value_double   REAL    NULL,    _value_numeric  REAL    NULL,            &#8212; NUMERIC(38,18): REAL \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e    &#8230;);_values\u00a0\u2014 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430 (\u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, [\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430]). \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0438\u0434\u0435\u044f \u2014\u00a0\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438-\u0441\u043b\u043e\u0442\u044b: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u0435\u0436\u0438\u0442 \u043d\u0435 \u0432 \u043e\u0434\u043d\u043e\u0439 \u00ab\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439\u00bb \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435, \u0430 \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u0438\u043f\u0430:CREATE TABLE _values(    _id              INTEGER NOT NULL PRIMARY KEY,    _id_structure    INTEGER NOT NULL,       &#8212; RTTI: \u041a\u0410\u041a\u041e\u0415 \u044d\u0442\u043e \u043f\u043e\u043b\u0435    _id_object       INTEGER NOT NULL,    _String          TEXT    NULL,    _Long            INTEGER NULL,    _Guid            TEXT    NULL,    _Double          REAL    NULL,    _DateTimeOffset  REAL    NULL,           &#8212; DateTime\/DateTimeOffset\/DateOnly \u043a\u0430\u043a UTC Julian    _Boolean         INTEGER NULL,           &#8212; 0\/1    _ByteArray       BLOB    NULL,    _Numeric         REAL    NULL,    _ListItem        INTEGER NULL,    _Object          INTEGER NULL,           &#8212; \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442    _array_parent_id INTEGER NULL,           &#8212; \u043c\u0430\u0441\u0441\u0438\u0432\u044b\/\u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u2014 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e    _array_index     INTEGER NULL);\u0414\u0432\u0430 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435:\u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0442\u044b, \u0430 \u043d\u0435 \u00ab\u0432\u0441\u0451 \u0441\u0442\u0440\u043e\u043a\u043e\u0439\u00bb.\u00a0Boolean\u00a0\u2014 \u044d\u0442\u043e\u00a00\/1,\u00a0DateTimeOffset\u00a0\u2014 REAL Julian,\u00a0Long\u00a0\u2014 \u0446\u0435\u043b\u043e\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 SQL \u0438\u0434\u0443\u0442 \u043f\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 (\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f), \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043a\u0430\u0441\u0442. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u043d\u0435 EAV\u00bb:\u00a0values\u00a0\u2014 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 props-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0430\u00a0idstructure\u00a0\u2192\u00a0_structures\u00a0\u043d\u0435\u0441\u0451\u0442 RTTI \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u043e\u0435 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0438 \u043a\u0430\u043a\u043e\u0433\u043e \u043e\u043d\u043e \u0442\u0438\u043f\u0430. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0442\u0438\u043f \u043f\u043e\u043b\u044f \u2014 \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043a\u0443-\u0441\u043b\u043e\u0442 \u0434\u043b\u044f\u00a0MAX(&#8230;) FILTER\u00a0\u0432 \u043f\u0438\u0432\u043e\u0442\u0435; \u0431\u0435\u0437 RTTI \u043e\u043d \u0431\u044b \u043d\u0435 \u0437\u043d\u0430\u043b, \u0438\u0437 \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u00a0LastName.\u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u2014 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e, \u0447\u0435\u0440\u0435\u0437\u00a0arrayparent_id\/_array_index, \u0430 \u043d\u0435 JSON-\u0431\u043b\u043e\u0431\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0445\u00a0GROUP BY-\u043e\u043c \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, \u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0443\u043c\u0435\u0435\u0442 \u043f\u043e \u043d\u0438\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c (_array_index IS NULL\u00a0\u0432 \u043f\u0438\u0432\u043e\u0442\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u043b\u044f \u043e\u0442 \u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432).\u0414\u0430\u043b\u044c\u0448\u0435 \u00ab\u0434\u0432\u0438\u0436\u043e\u043a \u0432 \u0431\u0430\u0437\u0435\u00bb = \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0438\u0442\u0430\u044e\u0442\/\u043f\u0438\u0448\u0443\u0442 \u0440\u043e\u0432\u043d\u043e \u044d\u0442\u0438 \u0434\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0441\u0432\u0435\u0440\u044f\u044f\u0441\u044c \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u00a0schemes\/structures.\u0427\u0430\u0441\u0442\u044c 1. \u041d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435: \u0430\u043d\u0430\u0442\u043e\u043c\u0438\u044f\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 SQLite \u2014 \u044d\u0442\u043e\u00a0.so\/.dll\/.dylib\u00a0\u0441 \u043e\u0434\u043d\u043e\u0439 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439-\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c. \u0418\u043c\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437 basename \u0444\u0430\u0439\u043b\u0430: \u0434\u043b\u044f\u00a0redb.dll\u00a0\u044d\u0442\u043e\u00a0sqlite3_redb_init. \u0412\u043d\u0443\u0442\u0440\u0438 \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 SQL-\u0444\u0443\u043d\u043a\u0446\u0438\u0439:SQLITE_EXTENSION_INIT1int sqlite3_redb_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi){  SQLITE_EXTENSION_INIT2(pApi);  int rc;  rc = sqlite3_create_function(db, &#171;get_object_json&#187;, 1, SQLITE_UTF8, 0,                               getObjectJsonFunc, 0, 0);  if(rc != SQLITE_OK) return rc;  rc = sqlite3_create_function(db, &#171;get_object_json&#187;, 2, SQLITE_UTF8, 0,                               getObjectJsonFunc, 0, 0);   \/\/ overload: (_id, max_depth)  if(rc != SQLITE_OK) return rc;  rc = sqlite3_create_function(db, &#171;save_object_json&#187;, 1, SQLITE_UTF8, 0,                               saveObjectJsonFunc, 0, 0);  if(rc != SQLITE_OK) return rc;  rc = redbRegisterPvt(db);   \/\/ \u0432\u0435\u0441\u044c pvt_*-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440  return rc;}SQLITE_EXTENSION_INIT1\u00a0\/\u00a0INIT2\u00a0\u2014 \u044d\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0438\u0437\u00a0sqlite3ext.h, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044e\u0442 \u043f\u0440\u044f\u043c\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b\u00a0sqlite3_*\u00a0\u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u044b \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\u00a0pApi. \u041d\u044e\u0430\u043d\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u0433\u043b\u044f\u0434\u0435\u0442\u044c: \u043f\u043e\u0441\u043b\u0435\u00a0INIT2\u00a0\u0432\u0441\u0451\u00a0API SQLite \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0417\u0430\u0431\u044b\u043b\u0438\u00a0INIT2\u00a0\u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u00a0sqlite3_*\u00a0\u0441 \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c.\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u2014 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439: \u043e\u043d\u0438\u00a0\u043d\u0435 \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b. SQLite \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438 \u043d\u043e\u0432\u043e\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438. \u0410\u00a0Microsoft.Data.Sqlite\u00a0\u043f\u0443\u043b\u0438\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0417\u043d\u0430\u0447\u0438\u0442 \u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430\u0434\u043e\u00a0\u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439\u00a0\u043a\u043e\u043d\u043d\u0435\u043a\u0442, \u043f\u043e\u0441\u043b\u0435 PRAGMA. \u0423 \u043d\u0430\u0441 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434\u00a0SqliteConnection: \u043e\u0442\u043a\u0440\u044b\u043b\u0438 \u2192 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043b\u0438\u00a0foreign_keys=ON\u00a0\u0438\u00a0busy_timeout\u00a0\u2192 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u2192 \u043e\u0442\u0434\u0430\u043b\u0438 \u0432 \u043f\u0443\u043b.\u041f\u0443\u0442\u044c \u043a \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0443 \u0438\u0449\u0435\u0442\u0441\u044f \u0442\u0430\u043a:\u042f\u0432\u043d\u044b\u0439\u00a0SqliteDataSource.NativeExtensionPath\u00a0(\u0435\u0441\u043b\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043a\u043e\u0434\u0435).\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u00a0REDB_SQLITE_EXTENSION.\u0418\u043d\u0430\u0447\u0435 \u2014\u00a0redb.{dll,so,dylib}\u00a0\u0438\u0437\u00a0runtimes\/&lt;rid&gt;\/native\/\u00a0NuGet-\u043f\u0430\u043a\u0435\u0442\u0430; \u0432 \u0434\u0435\u0432\u0435 \u2014 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u043c \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0434\u043e\u00a0redb.SQLite\/native\/build.Pro \u043f\u0443\u0442\u044c \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u043e\u043e\u0431\u0449\u0435: \u0435\u043c\u0443 \u043d\u0430\u0442\u0438\u0432\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u0438 \u0432 WASM\/\u043c\u043e\u0431\u0438\u043b\u043a\u0435 \u0435\u0451 \u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b.\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430: \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0430\u0440\u043e\u043c\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u2014 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0438 \u0443 \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0431\u043e\u043d\u0443\u0441: \u043e\u043d\u043e \u043d\u0435 \u043b\u0438\u043d\u043a\u0443\u0435\u0442\u0441\u044f\u00a0\u043d\u0438 \u0441 \u0447\u0435\u043c.\u00a0sqlite3ext.h\u00a0\u043e\u0442\u0434\u0430\u0451\u0442 API \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u0443 \u0445\u043e\u0441\u0442\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u044d\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442\u00a0SQLITE_EXTENSION_INIT2) \u2014 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0435\u0442 \u043d\u0438\u00a0libsqlite3, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u0438\u0441\u043a\u0430\u0442\u044c, \u043d\u0438 import-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u0438 target-sysroot. \u041a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u00ab\u0443\u043a\u0430\u0436\u0438 CMake \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u00bb:# linux-arm64 \u0441 x64-\u043c\u0430\u0448\u0438\u043d\u044b, \u0432 \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u2014 sysroot \u043d\u0435 \u043d\u0443\u0436\u0435\u043ddocker run &#8212;rm -v &#171;$PWD:\/work&#187; debian:bookworm bash -c &#8216;  apt-get update &amp;&amp; apt-get install -y cmake make gcc-aarch64-linux-gnu  cd \/work\/redb.SQLite\/native  cmake -S . -B build-linux-arm64 -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc  cmake &#8212;build build-linux-arm64&#8217;# \u2192 build-linux-arm64\/redb.so: ELF 64-bit LSB shared object, ARM aarch64\u041d\u0430\u0442\u0438\u0432\u043d\u043e\u0439&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-485553","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485553","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=485553"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485553\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=485553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=485553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=485553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}