Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) написал статью  1с и sqlite (число прочтений - 24775 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
написал статью  1с и sqlite
23. Августа 2007 :: 04:50
Печать  
точно не знаю в какой из форумов надо разместить subj.
В архиве прилагается статья и маленькая тестовая конфигурация
  

forum_1cpp.zip ( 23 KB | Загрузки )
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #1 - 23. Августа 2007 :: 05:21
Печать  
ИМХО нужно текст из ридми-файла выложить прямо в эту ветку, а основной файл пусть будет приложен.

Так удобнее читать и обсуждать Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #2 - 23. Августа 2007 :: 05:30
Печать  
А SQLite не требует инсталляции ?
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #3 - 23. Августа 2007 :: 05:42
Печать  
Пролог
Как все начиналось и до чего я докатился :
Поводом задуматься послужила ветка
http://www.1cpp.ru/forum/YaBB.pl?num=1183433748
И всплыло задание по передаче прайса на сайт.
Первой мыслью  был  XML но призадумался и оказалось
что создать бд в формате sqliti ничем не хуже XML особенно
если сайт написан на php.


Итак Что такое sqlite ?

SQLite отличается от других SQL движков баз данных тем, что его основная цель - быть простым:
   * простым в администрировании
   * простым в применении
   * простым для встраивания в большие программы
   * простым для поддержки и модификации


официальный сайт http://www.sqlite.org/
Далее везде речь идет о sqlite версии 3.


Очень кратко о sqlite

- sqlite Особая sql субд встраиваемая в приложение. Нулевая дистанция между  приложением и субд.

- соответствует большинству стандартов sql92 и
одновременно имеет изящные расширения  например
     CREATE TABLE  IF NOT EXISTS region ....   - создать таблицу region если она не существует ( если таблица уже есть ничего не делаем )

- в sqlite есть индексы, view, тригерры.

- БД может одновременно использоваться разными компьютерами ( с разным порядком байтов )

- в sqlite есть blob поля

- есть блокировки - три вида блокировок и
транзакции ( нельзя использовать вложенные транзакции совсем как в 1с).

- огромные размеры БД : поддерживаюся базы до 2 терабайт,
колво строк в таблице до 2**64,
строка и blob могут быть размером до 2 гигибайт
точные ограничения см http://www.sqlite.org/limits.html

- малый размер управляющего кода менее 250 кб

- можно скомпилировать сборку под себя изменив опции компиляции и/или сам исходный код.

- простое API хорошо документированное

- есть исходный код

- sql операторы хорошо документированы, есть документация что не поддерживается в sqlite,
особенности NULL

- есть очень много интерфейсов со многими языкама и средами программирования
на многих платформах( наверное на всех, включая кпк,смартфоны ...)

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

- бесплатность как самой бд так и исходников

- В sqlite можно определить СВОи функции и потом использовать их в любых sql операторах

- В sqlite есть параметризированные запросы и компиляция запросов

- Сразу после выполнения запроса SELECT извесно сколько есть строк в выполненом запросе.

- большая динамика развития sqlite очередная версия появляется примерно раз в месяц, а так как
этой бд пользуется очень много людей то и надежность и тестирование должно быть на уровне.

- в sqlite есть виртуальные таблицы, а также бд можно полностью создать в памяти.

- не обошли эту бд и такие монстры как Google присвоило sqlite лучший продукт
open source 2005 года (http://osdir.com/Article6677.phtml)
В третьей версии Firefox sqlite будет встроена внутри браузера.



Замечания по использованию sqlite :

Далее в своих примерах я использую только utf-8.
Чтобы как можно меньше  зависить от кодировок и/или их различий на разных платформах
рекомендую предерживаться ограничений :
1. Полный путь файла к бд sqltite не содержал русских букв только латинские.
2. Операторы sqlite (SELECT, FROM и.т.д. ) писать только заглавными латинскими буквами
3. Для имен таблиц, полей таблиц, индексов и.т.д использовать только маленькие
латинские буквы и цифры.


sqlite

На форуме слишком маленький размер присоед файла поэтому даю прямые ссылки на продукты
скачать sqlite можно здесь http://www.sqlite.org/download.html
Precompiled Binaries For Windows
sqlite-3_4_2.zip (179.14 KiB) сейчас версия 3.4.2.
скачиваем архив распоковываем. Запускаем
Все у Вас есть sqlite. Это примитивная консольная оболочка но в ней тоже можно работать.
Запускается так sqlite.exe <Полный путь к бд>. Если такого файла нет то создается бд sqlite.
Самая интересная команда в этой оболочке .pragma позволяет задать системные характеристики БД.
Также в интернете есть очень много визуальный оболочек наподобие EntepraseManager -
но все они путаются с кодировками ( и есть оболочки для sqlite 2) и лучше их не использовать.
Наиболее функциональная из них SQLite Expert version  ( но платная )
в этой оболочке я проверял что BLOB правильно были внесены в БД sqlite.


  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #4 - 23. Августа 2007 :: 05:44
Печать  

LiteX это Com объект обертка над Sqlite API.

весь объект с описанием и ссылкой на скачивание находятся
здесь http://roed.republika.pl/litex/automation.html
Скачиваем расспаковываем, регистрируем
regsvr32 <путь>sqlite3.dll

Если после этого  в 1с программа не жалуется на
oDb = СоздатьОбект("LiteX.LiteConnection");
то все установка LiteX завершена и можно использовать его на языке 1с.
LiteX внутри себя содержит весь sqlite и пользоваться бд sqlite можно
используя методы и свойства LiteX.
В тестовой конфигурации показано на примерах как  работает объект liteX.

В файле qlite3.dll находиться объект "LiteX.LiteConnection" позволяет манипулировть данными в формате utf-8
точно такой же объект
В файле qlite3u.dll находиться объект "LiteXU.LiteConnection" позволяет манипулировть данными в формате utf-16


Выявленые Недочеты LiteX :


Первый недочет Что непонятно LiteX выдает версию 3,3,5 а сейчас уже 3,4,2 т.е. получается
что надо разбираться и самим перекомпилировать объект чтобы получить самую последнюю версию.
Второй недочет  то что свойство RowCount возвращает int64 и 1с его не понимает.
Третий недочет не удалось напрямую через LiteX читать,писать BLOB
Ошибка в том что 1с не может передать как параметр объект ADODB.Stream.
На javascript все работает безукоризнено.
Поэтому в тесте из 1с вызываем javascript ( get.js и put.js ) и тогда
уже читаем пишем BLOB




sqlite и ODBC


документация по odbc http://www.ch-werner.de/sqliteodbc/html/index.html
последняя версия  odbc http://www.ch-werner.de/sqliteodbc/
Просто копируем последний файл и устанавливаем.
В тестовом примере приводиться работа и с odbc sqlite.
При чтении данных  из бд odbc не преобразует данные из utf-8 в win1251 ( изменение флажков
в odbc ни к чему не приводит). Наверное odbc не может отличить blob от  text или
не знает что нужно пользователю win1251 или unicode
и поэтому при возврате строк не делает никаких преобразований т.е. возвращает
строку в формате utf-8
Пример по update поля blob не получился (может кто скажет в чем ошибка  этот пример тоже есть
в тестовой конфе но закоментарен) зато работает insert.
select по blob  также не получился но  может это и мои ошибки до этого я не пользовался объектом
BinaryData.
Все это есть в тестовых примерах.


Тестовая конфигурация 1с


Архив содержит файл sqlite_1c.zip.
В чистой базе можно через конфигуратор --> Администрирование --> загрузить данные
получает тестовую конфигурацию. В каталоге базы 1с должна быть папка image из этого архива.
Все. Запускаем единственный отчет и проверяем работу sqlite из 1с.
Кнопка  создать БД создает БД и именем 1c.db в каталоге базы 1с.
создается база и единственная таблица в ней book
нажимая кнопку повторно текущая  версия 1c.db будет  будет уничтожена
Далее  нужно простучать три кнопки добавить записи. При этом в БД 1c.db
будет добавлено в таблицу book 5 записей.
Первая кнопка использует LiteX, вторая - odbc и  последняя запись сделана только для проверки букв Ёё.
Блок извлечь записи  : первая кнопка извлекает все записи из таблицы book
вторая кнопка извлекает все записи из таблицы book с ограничением where
третья кнопка извлекает данные используя odbc
Далее показано как можно читать и писать BLOB объекты.

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #5 - 23. Августа 2007 :: 05:45
Печать  
Что может дать sqlite для 1с.

Таблица в БД sqlite очень похожа на Таблицу значений 1c.
какие есть типы поля таблицы INTEGER , REAL, TEXT, BLOB, NULL.
Эта таблица слаботипизированна. Можно указать даже длину поля
техт (30) но тем не менее Вы в это поле можете записать и строку с длиной 100 и с длиной 1000 и
даже blob объект. Далее если мы в колонку с типом INTEGER будем сохранять строку то произойдет следущее
если возможно преобразовать эту строку в число то в таблицу запишется число иначе в таблицу
запишется строка.
SQLite версии 3.0 и выше позволяет хранить BLOB данные в любом поле, даже если оно объявлено как поле другого типа.
Фактически типы колонок являются чисто описательными и необязательно точно соответствуют данным.

1. Можно использовать таблицу sqlite вместо Таблицы значений.
Скорее всего sqlite будет быстрее и стандартной Таблицы значений и индексированной ТЗ из 1с++.
В результате мы получим все то что и сейчас плюс  обращение к ТЗ используя sql операторы.
в sqlite есть оператор attach - т.е. к одной бд можно прилинковать ( ATTACH ) другую sqlite бд,
а значит если у нас есть две таблицы значений в двух разных sqlite базах
то мы сможем к этим ДВУМ ТЗ написать один sql запрос.
2. скопировать одну sqlite таблицу можно одним оператором в рамках одной бд.
3. удалить строки аналогично заводим новый столбец помечаем в этом столбце строки к удалению
и одной командой удаляем все ненужные строки из таблицы.
4. можно хранить в sqlite бинарные данные ( сертификаты, фотографии ) это лучше чем множество файлов.
Особенно это подходит тем  кто только собирается переходить от dbf к sql.
5. Можно использовать sqlite бд в качестве хранилища. Причем хранилищ может быть много.
Можно полностью написать, повторить функционал v8 методы и свойства ХранилищаЗНачений.
6. Можно использовать sqlite базу для интерфейса с другими приложениями
и не обязательно на PC платформе.
7. в wiki sqlite  (http://www.sqlite.org/cvstrac/wiki) описаны множество бесплатных и платных расширений.
например достаточно легко сделать crypt поля причем управлять секретностью будете Вы сами,
или создать БД по технологии клиент-сервер используя сокеты получив свою собственную СУБД простейший клиент-сервер.

Грамотно используя возможности  sqlite - значительно рассширяем область применения 1с.

Еще тенденция т.к. локальные компьютеры пользователей становяться все мощнее и объемы RAM памяти
тоже возрастают, то при использовании sqlite многие вычисления будут выполняться очень быстро при этом
использую все имеющиеся ресурсы компьютера.


Что дальше

Что лучше Litex ( или улучшенный свой объект  ) или достаточно odbc вопрос ?
odbc должен работать с Табличным Полем.
Что можно сделать - на основе Litex написать свою оболочку  внешнюю  ( сом объект ) и/или
внутренюю внутри 1с++.
При этом надо брать самую последнюю версию sqlite.
Поправить работу например свойство RowCount (объекта LiteX.LiteStatement)
возвращает int 64 что 1с не может переварить.
Аналогично не удалось записать,прочитать blob поля хотя на javascript все идет без проблем.
Примеры на javascript прилагаются.
Кстати прочитал о проэкте JET Blue (Microsoft) - мне не понравилось.
Главный недостаток ( имхо) Эти БД (JET Blue) несовместимы даже между разными Windows платформами (Хр и Win2000 b Win2003).


Если кто-то придумает  постановку задачи  ( для теста ) то я могу  сравнить sqlite и все варианты из см
http://www.1cpp.ru/forum/YaBB.pl?num=1183433748 и sqlite Litex и  sqlite odbc.




Эпилог


Самый пессимистичекий прогноз эта тема окажется неинтересной и все скоро забудут об этом.
Самый оптимистический прогноз - сообщество этого форума еще больше подружит
1с и sqlite и родиться новый подфорум на 1cpp :   1с and sqlite
Время покажет...
с уважением, Морев Андрей  aka Z1
по каким либо вопросам со мной можно связаться либо через форум 1cpp, либо e-mail  t_dik (Dog) mail (point) ru

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #6 - 23. Августа 2007 :: 06:16
Печать  
ev-kov писал(а) 23. Августа 2007 :: 05:30:
А SQLite не требует инсталляции ?


инсталировать надо sqlite.exe , LiteX и odbc sqlite - все ссылки есть и как устанавливать тоже сказано.
объект LiteX  не использует 1сpp  и может работать там где не установлен 1с++
odbc sqlite работает используя 1сpp.
Еще мелкий баг в тестовой конйигурации в глоб модуле  надо оставить
только одну строку ( незаметил т.к. у меня так настроено)
     имя1 = "1cpp.dll";
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #7 - 23. Августа 2007 :: 06:59
Печать  
Ну более реалистичен прогноз "золотая середина". Кто-то примет к сведению и будет использовать а кто-то нет.
Мне кажется еще стоит упомянуть, да и поработать с сервером для SQLite.
http://www.opennet.ru/prog/info/3154.shtml
  
Наверх
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #8 - 23. Августа 2007 :: 07:03
Печать  
Z1 писал(а) 23. Августа 2007 :: 05:42:
Наиболее функциональная из них SQLite Expert version  ( но платная )
в этой оболочке я проверял что BLOB правильно были внесены в БД sqlite.

Там же и фриварная есть.
Download SQLite Expert Personal 1.5.30 (Freeware)
  
Наверх
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #9 - 23. Августа 2007 :: 07:17
Печать  
(0) Еще один момент. Рассматривал режим ":memory:" (создание базы данных в оперативной памяти)?
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #10 - 23. Августа 2007 :: 07:29
Печать  
trdm писал(а) 23. Августа 2007 :: 07:17:
(0) Еще один момент. Рассматривал режим ":memory:" (создание базы данных в оперативной памяти)?

Лично не пробовал,  но у объекта LiteX есть метод
OpenInMemory() - открываешь  и далее работаешь с этой БД.

про ODBC не знаю скорее всего не работает надо читать.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: написал статью  1с и sqlite
Ответ #11 - 26. Августа 2007 :: 16:55
Печать  
Z1

Безумно интересно.
Примкну-ка я сегодня к оптимистам. Улыбка

Набросал небольшой тест производительности ИТ vs LiteX.LiteConnection/:memory:
Работать через automation неудобно, медленно, что-то вообще не получилось сделать (параметрические запросы не взлетели).

Ну, это мелочи, потенциал, конечно, огромный.
Только нужна быстрая реализация удобной объектной модели, поддержка преобразований встроенных типов, интеграция со встроенными объектами и.т.п.
  

_TestSQLLITE.ert ( 7 KB | Загрузки )

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: написал статью  1с и sqlite
Ответ #12 - 26. Августа 2007 :: 17:11
Печать  
Z1 писал(а) 23. Августа 2007 :: 05:45:
Что лучше Litex ( или улучшенный свой объект  ) или достаточно odbc вопрос ?
odbc должен работать с Табличным Полем.

Прелесть в том, что отбросив odbc и написав поставщика непосредственно для SQLLITE, можно будет использовать его для любых данных SQLLITE, как на диске, так и в памяти.

А вот что еще интересно, в свете последних тенденций в синематографе, как оно у SQLLITE с распараллеливанием потоков?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: написал статью  1с и sqlite
Ответ #13 - 26. Августа 2007 :: 20:31
Печать  
Z1 писал(а) 23. Августа 2007 :: 05:42:
Пролог
Как все начиналось и до чего я докатился :
Поводом задуматься послужила ветка
http://www.1cpp.ru/forum/YaBB.pl?num=1183433748
И всплыло задание по передаче прайса на сайт.



Был ли организован обмен в результате?
Я так понимаю - через файл бызы данных? Какой объем по сравнению с XML ?
И по идее - прирост в скорости обмена должен быть колоссальным,
особенно по сравнению с 8.0, где народ жалуется на то , что выгрузка занимает часы...
?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: написал статью  1с и sqlite
Ответ #14 - 27. Августа 2007 :: 06:15
Печать  
kms писал(а) 26. Августа 2007 :: 16:55:
Z1

Безумно интересно.
Примкну-ка я сегодня к оптимистам. Улыбка

параметрические запросы не взлетели


Параметрические запросы не работают потому-что метод BindParameter не может выполниться. Этот метод заработает в 1с  если задать имя параметравместо номера.
Как задавать имя у параметра не знаю.
Тест на js ( прилагается ) с парамтрическим запросом идет без проблем.
Т.е. это недостатки взаимодействия объекта LiteX с внутренним языком 1с.
  

sample1.zip ( 0 KB | Загрузки )
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать