Използване на sqlite мениджър за работа с sqlite subd

Вероятно всеки разработчик се е сблъсквал с бази данни на SQLite поне веднъж в кариерата си. И ако той е зает с мобилни приложения, тогава, очевидно, той просто няма шанс да ги избегне. Ние не правим изключение и често използваме тази прекрасна база данни в нашите проекти. Както знаете, само конзолата е официално предоставена от създателите на SQLite за администриране. Това породи цял набор от чудовища, куп различни мениджъри от компании на трети страни.

Уви, количеството не се превърна в качество. В всичкоприложения, открихме определени проблеми. Някои са малко шокиращи. Например, много популярен мениджър е безплатната добавка за браузър Firefox с непретенциозното име SQLite Manager. 234 записа в неговата програма за проследяване на проблеми (как би било на руски?) ще разклатят вярата в бъдещето дори и за опитен ИТ специалист. „Неправилно показване на 8-байтови числа.“Да, точно така, този мениджър не може правилно да покаже всички цифри в 8-байтово цяло число (очевидно поради естеството му на javascript). Познайте на кого му пука за големите числа?

Много мениджъри са универсални (те поддържат всички популярни бази данни) и просто не ви позволяват да използвате всички функции на SQLite (от които има много). Друг проблем: претоварен интерфейс. Често имаше усещането, че разработчиците просто „изхвърлят“ цялата функционалност на приложението на главния екран под формата на куп малки бутони. Също така беше досадно да се разделят функциите в няколко приложения: редактор на данни, редактор на схеми, импортер на данни и т.н. Маркетингът е добър, но неудобен за използване. И накрая, модната сега мода - пускане на приложение на няколко платформи наведнъж с една кодова база и рамка - често води до куп малки грешки в интерфейса: проблеми с шрифтовете, неправилно кодиране, неправилна височина на реда, "напускане" на контроли , и т.н.

Съмненията ни бяха подсилени от една публикация на stackoverflow.com, която заключи, че „въпреки големия брой SQLite мениджъри на бази данни, няма наистина удобен и това играе негативна роля по отношение на популяризирането на SQLite“. И така се роди този проект.

Позволете ми да ви представя: sqlitedogе модерен SQLite мениджър на база данни. Искахме леко да променим познатия интерфейс на редактора на база данни, така че да изглежда по-скоро като „микс от Excel и Chrome“, отколкото „SQL Server Management Studio“. Изхождахме от следната мантра: мениджърът на базата данни стои на „трите стълба“. Това са самите данни, схемата на данните и SQL заявките. Извадката от данни трябва да бъде направена възможно най-просто и удобно, данните трябва да се показват възможно най-полезно (вижте по-долу). Трябва да покажете схемата на данните визуално и да позволите да се променя произволно. SQL редакторът трябва да е красив, удобен; работата със SQL не би трябвало да е проблем. Исках също да имам ясен и удобен механизъм за управление на настройките на SQLite (PRAGMA), които са много и които влияят много. Например ограниченията на външния ключ са деактивирани по подразбиране и размерът на кеша е 2000 основни страници. В 95% от случаите това не са най-добрите настройки, но обикновено са „скрити“ в някакъв вид подменю.

И така, започнахме да анализираме съществуващите приложения, да събираме идеи и желания. И този етап отне около 3 месеца. Основното разбиране беше следното: почти всички редактори на бази данни са изградени върху архаични интерфейсни решения, които копират един от друг. Нека да дадем няколко примера.

Дърво на DB обекти
Това е такъв контрол за изтезания, който обикновено се намира отляво и съдържа връзки към базата данни и обекти на базата данни, свързани в дървета. За да стигнете например до колоните на таблица, обикновено трябва:
- разширете списъка с бази данни и намерете тази, от която се нуждаете;
- разгънете клона "Таблици";
- намерете желаната таблица;
- разгънете клона "Колони".
Освен това самата операция на "разгръщане" означава:
- удряне на мишката в мъничък кръст, който всеки път сменя позицията си;
- появата на нов списък, който трябва да бъде проучен и който измества вече съществуващото представяне на дървото.
Ако се замислите, дървото е може би най-неудобният възможен контрол; използва се поради гъвкавостта (може да се бутне всяка йерархия). Въпреки това, сценарият на работа с базата данни обикновено е по-сложен от просто "преглед на колони". Да приемем, че потребителят иска да разбере дали колоната има някакво ограничение. Как може списък с колони да ни помогне в този случай? Не, защото ограничението на колоната може да бъде зададено на ниво таблица. Ами ако потребителят търси конкретна колона в множество таблици? За него е много по-удобно да отвори схемата на базата данни, където всичко, от което се нуждаете, ще бъде на един екран наведнъж (вместо да разширява всяка таблица). И т.н.
Също така, не ни хареса (обичайната) практика да работим с множество бази данни в едно приложение. Струваше ни се, че това е източник на объркване и усложнение: през цялото време трябва да разберете в коя база данни извършвате това или онова действие. Решихме, че един екземпляр на приложението работи с точно една база данни (една връзка) и изоставихме дървото в полза на линеен списък от таблици и изгледи. Можете бързо да превключите към всяка база от историята. В резултат на това, за да видите и редактирате схемата на таблицата в SqliteDog, трябва да направите само две щраквания. В този случай елементите от списъка с обекти на базата данни, разбира се, не се движат, а остават на местата си.
Запазване на SQL заявки
Както често се случва, едно решение доведе до друго. Веднага след като решихме, че искаме бързо да превключваме между бази данни, нулиране на цялото текущо състояние, възникна проблемът със загубата на въведените SQL заявки. Да съхранявате SQL заявки във файлове? Но защо? Отново - архаизъм. Имаме "под ръка" най-мощната СУБД. Размерите на заявките обикновено са малки. Запазването на тяхната история няма да е проблем. Така автоматично записваме всички заявки в специална база данни. Няма го този досаден прозорец „Направихте промени, бихте ли искали да запазите?“, какво облекчение. Но нещо е загубено. Имената на файловете носят някаква информация, обвързване, а сега изобщо не са. Решихме този проблем, като направихме търсене в историята на ключовите думи на заявката.
Преглед на избраните данни в таблица
Всички мениджъри на бази данни ви позволяват да показвате исканите данни в таблицата (това не може да бъде отнето от тях). Как го правят? Например ширини на колоните. Обикновено, вместо да се вписва в съдържанието, се използва просто разделяне на цялата ширина равномерно на броя на колоните. Това е изключително разточително място на екрана. Или направете представяне на данните. Защо не покажете веднага цвета на какъв тип стойност: низ или число? Защо номерът не е избит веднага вдясно? Празна клетка NULL ли е или празен низ? За да разберете, все пак трябва да щракнете върху клетката и да разгледате някои свойства, защо? Ако клетката съдържа BLOB (двоични данни) - защо трябва да виждам нейното шестнадесетично представяне? Каква е причината? Имайте предвид, че всички мениджъри с гордост се хвалят с показването на изображения в BLOB. Благодаря, разбира се, но низовете и числата все още се използват по-често. Има и такъв (доста странен) прием. Ако стойността на колоната е низ с връщане на карета, тогава височината на реда на таблицата се увеличава пропорционално на броя на редовете. Тоест, да приемем, че имате малки XML текстове, съхранявани в колона. Когато гледате, сега на един екран се побират максимум 3 записа.
В SqliteDog се опитахме да „изцедим максималното“, което е полезно при показване на данни. Веднага, без допълнителни настройки. Числовите стойности са маркирани в цвят и са изместени вдясно. Стойността NULL се показва специално и лесно се различава от празния низ. За BLOB-овете се показва размерът. Ако низът за стойност съдържа контролни знаци ("\r\n"), те се маркират с различен цвят, височината на реда на таблицата не се увеличава. Снимките, разбира се, също се показват. И с едно щракване можете да видите картината на цял екран. Чрез щракване (или натискане на F4) ширината на колоните на видимите редове се регулира равномерно, за да пасне на тяхното съдържание. Двойното щракване върху клетка регулира ширината на определена колона. Можете да превъртате през таблицата както с мишката, така и с клавиатурата. Освен това, превъртането на колелцето на мишката, докато държите натиснат клавиш Control, ви позволява да превъртате таблицата наляво и надясно. Всички тези малки неща правят живота по-лесен.
Какво е "нищо"?
Традиционно много приложения имат състояние "без документ". Например при стартиране. Нуждае ли се потребителят? Да предположим, че потребителят на SqliteDog затваря връзката с базата данни. Какво означава? Иска ли да отвори друга БД? Но защо да затворите текущата - просто отворете друга. Иска ли да свърши работата? Но тогава просто трябва да затворите приложението. Решението беше намерено по следния начин: има връзка с базата данни в SqliteDog винаги. Ако потребителят затвори базата данни, тогава SqliteDog създава празна база данни в паметта (една от най-полезните функции на SQLite). Същото важи и при стартиране на приложението. Веднага след като тази функция се появи, веднага се появи допълнителен случай на употреба. Понякога трябва бързо да запомните името на SQLite функция. Стартираме SqliteDog, прозорецът за въвеждане на SQL е наличен веднага. Започваме да въвеждаме името - отпада списък с автоматично довършване. Намираме желаната функция, копие, готово.
Компромиси Компромиси
С напредването на развитието стана ясно, че потенциално количеството функционалност е неограничено. Това е естеството на проекта. Винаги можете да намерите друг списък с желания. И решете, че без него - е, нищо. Затова беше взето решение за „бръснач“: някои от „големите“ функции влизат във „втората версия“. Решението за характеристиките беше взето колективно. По този начин се поддържа списък с активни задачи с приоритети и списък с функции на "втората версия". Удобно е да ги видите заедно, за да не измисляте едно и също нещо отново и отново. Случвало се е празните места за една функция да улесняват прилагането на друга и след това функцията се „връща“ от втората версия към първата. Също и от смешните моменти: някои функции бяха отложени толкова дълго, заменени от по-спешни, че в резултат на това не можете да плъзгате раздели с мишката в SqliteDog. Това ще бъде поправено във "втората версия" (вероятно :). Друг компромис е изборът на една платформа (Windows). Уви, не можахме да намерим приемлива за нас рамка, която да осигури кросплатформена без загуба на качество и скорост. Създаването на свой собствен, тоест преоткриването на колелото, все още е твърде много, целта първоначално беше друга. В резултат на това проектът беше „заточен“ за Windows (и отне около година). Но ние получихме отзивчивостта и качеството на дисплея на необходимото ниво.
Разрешително
Затова нека спрем (но ако хабра общността е заинтересована да продължи "сагата", тогава тя ще последва). Що се отнася до лиценза на продукта. Решихме, че освен комерсиалната, ще бъде налична и официалната безплатна версия на SqliteDog. Няма ограничения за време, брой редове, брой таблици, размер на базата данни и т.н. В безплатната версия, след 30 дни употреба, само дизайнери (бази данни, таблици и индекси) и някои данни за импортиране/експортиране стават недостъпни. Интерфейсът на SqliteDog е напълно русифициран (разбира се, има и английски превод за аматьори). Съществува и руската версия на сайта.
Заключение или TL; DR
SqliteDog е ефективен SQLite мениджър на база данни. Неговите създатели решиха да изоставят обичайните интерфейсни решения и да опростят и улеснят взаимодействието доколкото е възможно. Следователно, едно приложение = една база данни (по-точно една връзка, можете да ПРИКАЧИТЕ други бази данни). Примерните данни се показват възможно най-информативно, можете да преглеждате/сортирате и дори да редактирате записи по време на изпълнение на заявката (можете да спрете зареждането по всяко време, като натиснете Esc). Някои функции на SqliteDog са уникални. Например управление на транзакции чрез бутони на панела за свързване. Или режим на наблюдение на таблицата, в който автоматично се зареждат нови записи („Изберете последните 1000“, натиснете бутона със стрелката в кръга). Или възможността да отворите базовата схема и да я фиксирате в отделен прозорец на втория монитор (за да я имате винаги пред очите си). Или възможността за преобразуване на връщане на карета в стойност на колона от UNIX във формат на Windows с едно щракване.

Ще се радваме да чуем отзиви и предложения за подобрение. Благодарим ви за проявения интерес.

Етикети: Добавяне на етикети

SQLite е база данни, донякъде подобна на MySQL. Основната разлика между SQLite и други бази данни е, че цялата база данни е един файл. Ако в MySQL базата данни се съхранява някъде в дивата природа на сървъра и не е достъпна за трансфер, тогава в SQLite всичко е безобразно просто: един файл - една база данни.

Разбира се, сървърът трябва да поддържа SQLite драйвера (както и всяка друга база данни), но като правило няма проблеми с това сега.

SQLite ви позволява да работите с базата данни по обичайния начин чрез SQL, да създавате таблици, полета и т.н. Като цяло можем да кажем, че SQLite по никакъв начин не е по-нисък от обичайния MySQL, с възможно изключение на по-бавната работа с „тежки“ sql заявки за актуализиране на данни (вмъкване и актуализиране). Но, отново, това е за сайтове с високо натоварване.

Огромен плюс на SQLite е неговата лесна преносимост. Копиране на файл - какво може да бъде по-лесно? Не е нужно да се грижите за архивиране, както в MySQL, не е нужно да създавате потребител с парола на сървъра, не е нужно да създавате самата база данни. Със SQLite просто го вземаме и използваме.

За работа с база данни в PHP е по-добре да използвате PDO – PHP Data Objects – това е т.нар. абстракция, която предлага единен интерфейс за работа с различни бази данни. На теория, използвайки PDO, можете да преминете към всяка база данни, без да пренаписвате SQL заявки, например от MySQL към SQLite. Променят се само параметрите на връзката.

По този начин SQLite ще се свърже чрез PDO. Това не изисква нищо, тъй като самият PDO вече е включен в PHP, а драйверът на SQLite обикновено също е включен на сървърите.

Но преди да започнете да програмирате, трябва да създадете самата база. Например за MySQL има phpMyAdmin, чрез който можете да извършвате различни операции. Има и подобни разработки за SQLite, но ще покажа как можете да направите това чрез браузъра FireFox. За да направите това, трябва само да инсталирате добавката.

За да добавите тази добавка към главното меню на FireFox („хамбургер“), щракнете върху Редактиране и плъзнете иконата в менюто.

Това е инсталирано и можете да го използвате.

Първо, нека създадем нова база данни. В SQLite това е отделен файл, който ще има разширението .sqlite. SQLite Manager ще ви подкани да посочите директорията, в която ще се съхранява този файл. Изберете или създайте нова директория. В момента няма значение за нас. В резултат на това ще бъде създаден sqlite файл с нова база данни.

Този файл може да бъде преместен (и преименуван) навсякъде и след това отворен с командата от менюто Бази данни - Свържете базата данни.

Сега трябва да създадем таблица (или таблици) в базата данни.

SQLite Manager автоматично създава таблици за услуги sqlite_XXX. Не ги докосваме и те не ни пречат.

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

Нека например имаме таблица със страници с полета

  • документ за самоличност- уникален номер (автоматично увеличаване)
  • охлюв- връзка
  • текст- произволен текст
  • хитове- брой гледания

След като таблицата е създадена, обърнете внимание на блока "SQL оператор, който създаде този обект". Той ще съдържа SQL заявка, която може да създаде таблица. Може да е полезно, ако искате да създадете таблица в базата данни чрез PHP.

Можете да редактирате таблицата в раздела Преглед и търсене. Например, нека създадем два реда, където полето охлювще бъде вкъщи и контакт . Това ще бъдат две страници: У домаИ сайт/контакт.

Поле хитовеще съдържа брой показвания на страници. Текстът може да бъде всякакъв.

Всичко, основата е готова, сега можете да я използвате.

Да си поставим задача. Нека имаме прост сайт, който ще издаде кратка връзка (slug) със съответния текст и броя на гледанията.

Ако правим това на локален сървър, нека сайтът е в директорията sqlite. Има поддиректория db, където ще копираме нашите pages.sqlite.

Можем да направим маршрутизиране, както е описано в предишната статия. .htaccess файл

AddDefaultCharset UTF-8 Опции -Индекси RewriteEngine на RewriteBase /sqlite/ RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule (.*) /sqlite/index.php?$1

IN index.phpсамото маршрутизиране ще бъде описано в един ред:

$страница = ($p = ключ($_GET)) ? $p: "дом";

  • свържете основата
  • направете избор в него от $page
  • извежда получените данни
Умишлено опростявам алгоритъма, за да не усложнявам php кода.

Има два варианта за работа с базата данни. Първият е роден php код. Не е много сложно, но изобилието от параметри е малко досадно. Следователно, вторият вариант е да използвате допълнителни библиотеки за обвивки. С тях кодът става по-сбит.

Ще дам кода на index.php в първата версия:

setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $sql ="SELECT * FROM pages WHERE slug=: page LIMIT 1"; $sth = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $sth->execute(array(":page" => $page)); $редове = $sth->fetchAll(); print_r($редове); // извеждане на данни тук ) catch(Exception $e) ( echo $e->getMessage(); ) # край на файла

За втория вариант използвах php библиотеката от сайта labaka.ru, която поставих в поддиректория lib.

index.php код:

Този пример ще покаже различен текст за различни адреси и броят на посещенията ще работи. Ако искате да добавите нова страница, тогава е достатъчно да я създадете в базата данни. За удобство в SQLite Manager можете да свържете базата данни директно от директорията на сайта.

Тук трябва да се отбележат няколко важни момента.

На първо място, цялата работа с PDO трябва да бъде затворена в блок try..catch. Ето как се улавят съобщенията за грешки.

Данните, които се изпращат към sql заявката, трябва да преминат през валидиране. В PDO, когато се използва предварителна подготовка на данни (PDO::prepare), се налага екраниране на параметри. Това ви позволява да се предпазите от възможни SQL инжекции.

Когато SQLite база данни е свързана, ако няма файл с база данни, тя ще бъде създадена автоматично. Това е основата за създаване на базата данни веднага след свързването й и създаване на необходимите таблици с първата sql заявка (за която писах по-горе).

Още една бележка за SQLite. Тъй като базата данни е файл, тя може да бъде изтеглена от URL адреса директно през браузъра. Ето защо е по-добре да защитите директорията с SQLite файлове чрез .htaccess с реда Deny from all . Или поставете по-високо от главната www-директория.

SQLite може да бъде полезен за малки задачи, които изискват малка база данни: броячи, гласове, метаданни на страници и т.н.

Можете към тази статия.

|

Sqlite е много прост и бърз SQL двигател с отворен код. Това ръководство описва инсталирането и оптималното използване на Sqlite, за разлика от пълнофункционалните RDBMS като Mysql и Postgres, а също така обсъжда и дава примери за основното използване на CRUD (Създаване, четене, актуализиране и изтриване).

Не трябва да мислите, че Sqlite е създаден само за тестване и разработка. Например, той може да осигури сайт, според консервативни оценки, до 100 000 гледания на ден. Максималният размер на база данни на Sqlite е 140 терабайта (което е повече от достатъчно), тя може да бъде много по-бърза от пълноценна RDBMS. Пълната база данни и други необходими данни се съхраняват в обикновен файл във файловата система на хоста, така че не е необходим отделен сървърен процес (което елиминира необходимостта от комуникация между процесите).

Оптимално използване на VPS

Sqlite се фокусира върху простотата. Поради факта, че тази база данни е изцяло вътрешна, тя често е значително по-бърза от алтернативите. Sqlite е идеален за тези, които се нуждаят от преносимост (по отношение на езици и платформи), простота, скорост и ниска консумация на памет. Недостатъците на Sqlite са видими само когато трябва да четете или пишете в няколко файла паралелно: Sqlite поддържа само един редактор; в допълнение, обикновено голямото изоставане на файловата система може да бъде неудобно, ако трябва да работите в Sqlite едновременно за няколко потребители. Един последен възможен недостатък: синтаксисът на Sqlite е уникален, макар и подобен на други SQL системи. Преминаването към друга система след надрастване на Sqlite е достатъчно лесно, но може да доведе до допълнителни разходи за ресурси.

Инсталиране на Sqlite на VPS

Модулът sqlite3 е част от стандартната библиотека на Python, така че не се изисква допълнителна инсталация на стандартна система Ubuntu или на всяка друга система с инсталирана библиотека на Python. За да инсталирате Sqlite CLI на Ubuntu, използвайте тези команди:

sudo apt-получи актуализация
sudo apt-get инсталирайте sqlite3 libsqlite3-dev

Ако трябва да компилирате Sqlite от източник, изтеглете най-новата версия на autoconf от sqlite.org/download.html. По време на записа:

wget http://sqlite.org/2013/sqlite-autoconf-3080100.tar.gz
tar xvfz sqlite-autoconf-3080100.tar.gz
CD sqlite-autoconf-3080100
./конфигуриране
направи
направи инсталиране

Бележки за компилиране от източник:

  1. Не правете това в стандартен Ubuntu, тъй като е вероятно поради конфликт между съществуващите и новоинсталираните версии да възникне грешка "несъответствие на заглавката и изходната версия";
  2. Ако изглежда, че командата "make" чака по-нататъшно въвеждане, просто изчакайте - компилирането от източник отнема известно време.

Основен интерфейс на командния ред на Sqlite

За да създадете база данни, изпълнете командата:

sqlite3 database.db

където "база данни" е името на базата данни. Ако файлът "database.db" вече съществува, Sqlite ще го отвори; ако няма такъв файл, той ще бъде създаден. Полученият резултат изглежда така:

SQLite версия 3.8.1 2013-10-17 12:57:35
Въведете ".help" за инструкции
Въведете SQL изрази, завършени с ";"
sqlite>

Сега създайте таблица и я попълнете с тестови данни. Тази таблица се нарича "вина" и се състои от четири колони: ID, производител на вино, вид вино, страна на произход. В таблицата има три реда:

СЪЗДАВАНЕ НА ТАБЛИЧНИ вина (id цяло число, производител varchar(30), вид varchar(20), държава varchar(20));
ВМЕСТЕ В СТОЙНОСТИТЕ НА ВИНАТА (1, "Ройберг", "Пинотаж", "Южна Африка");
ВМЕСТЕ ВЪВ ВИНАТА СТОЙНОСТИ (2, "KWV", "Shiraz", "Южна Африка");
ВМЕСТЕ В СТОЙНОСТИТЕ НА ВИНАТА (3, "Marks & Spencer", "Pinot Noir", "France");

Така бяха създадени база данни и таблица, в която бяха направени някои записи. Сега натиснете Ctrl + D, за да излезете от Sqlite и въведете следното (заменяйки "база данни" с името на вашата база данни), което ще изведе базата данни, която току-що създадохте:

sqlite3 database.db

Сега напишете:

ИЗБЕРЕТЕ * ОТ вина;

Ще се покажат новодобавените записи:


2|KWV|Шираз|Южна Африка
3|Маркс и Спенсър|Пино ноар|Франция

Това е всичко, което трябва да знаете за създаването и четенето в Sqlite. Сега трябва да се запознаете с актуализацията и премахването:

АКТУАЛИЗИРАНЕ на вина SET country="Южна Африка" WHERE country="Франция";

Това ще актуализира базата данни и всички вина в списъка с произход от Франция ще бъдат маркирани като с произход от Южна Африка. Проверете резултата:

ИЗБЕРЕТЕ * ОТ вина;

Резултатът ще бъде такъв:

1|Ройберг|Пинотаж|Южна Африка
2|KWV|Шираз|Южна Африка
3|Маркс и Спенсър|Пино ноар|Южна Африка

Сега всички вина идват от Южна Африка. Сега опитайте да премахнете KWV от базата данни:

ИЗТРИВАНЕ ОТ вина, КЪДЕТО id=2;
ИЗБЕРЕТЕ * ОТ вина;

Сега списъкът ще има един запис по-малко:

Всички основни операции с базата данни са завършени. Завършваме с малко по-сложен пример, илюстриращ използването на две таблици и основна операция за свързване.

Излезте от Sqlite с Ctrl + D и се свържете отново с новата база данни с

sqlite3 database2.db

Ще бъде създадена таблица, много подобна на "wines", както и таблица "countries", която съхранява името на страната и името на настоящия й президент. Първо, създайте таблица "държави" и въведете Южна Африка и Франция в нея (обърнете внимание, че можете да копирате и поставите няколко реда SQLite код наведнъж):

СЪЗДАВАНЕ НА ТАБЛИЦА държави (id цяло число, име varchar(30), президент varchar(30));
ВМЕСТЕ В ЦЕННОСТИТЕ на държавите (1, „Южна Африка“, „Джейкъб Зума“);
INSERT INTO country VALUES(2, "Франция", "Франсоа Оланд");

Сега създайте отново таблицата "вина":

CREATE TABLE wines (id integer, kind varchar(30), country_id integer);
ВМЕСТЕ В ВИНА СТОЙНОСТИ (1, "Пинотаж", 1);
ВМЕСТЕ В ВИНА СТОЙНОСТИ (2, "Шираз", 1);
ВМЕСТЕ В ВИНА СТОЙНОСТИ (3, "Пино ноар", 2);

Вижте какви видове вина идват от Южна Африка:

ИЗБЕРЕТЕ вид ОТ вина ПРИСЪЕДИНЯВАЙТЕ се към държави ON country_id=countries.id WHERE countries.name="Южна Африка";

Ще се покаже следният резултат:

Пинотаж
Шираз

Така се извършва основната операция за сливане. Имайте предвид, че Sqlite прави много неща сам. Всъщност командата "JOIN" по подразбиране е "INNER JOIN", но може да се използва само ключовата дума "JOIN". Също така не е необходимо да посочвате „wines.country_id“, тъй като тази стойност е недвусмислена. От друга страна, ако въведете командата:

ИЗБЕРЕТЕ вид ОТ вина ПРИСЪЕДИНЯВАЙТЕ се държави ON country_id=id WHERE country_id=1;

Ще се покаже съобщение за грешка: "Грешка: двусмислено име на колона: идентификатор". това е вярно, тъй като в двете таблици има колона "id". Като цяло съобщенията за грешки в Sqlite помагат за откриване и отстраняване на проблеми доста бързо, което значително ускорява процеса на разработка. За повече информация относно синтаксиса вижте официалната документация за много графики: sqlite.org/lang_delete.html ; много е полезно, но ако предпочитате конкретни примери, ето линк към ръководство, обхващащо повечето типове обединения: zetcode.com/db/sqlite/joins/.

Освен това са разработени драйвери за Sqlite на всички основни езици, докато самият Sqlite работи на повечето системи.

Етикети: ,

SQLite е много популярно решение за съхранение и операционната система Android не е изключение. Самата система и много програми използват бази данни за съхранение на информация – файлове с разширение db. Какъв вид данни се съдържат в базите данни, как да ги видите, какво може да се направи с тях и какво заплашва устройство с права на суперпотребител - ще говоря за всичко това в статията.

ВНИМАНИЕ

Авторът на статията не е експерт по бази данни, нито SQLite, той разбира, че някои действия могат да се извършват по-лесно, а също така не носи отговорност за появата на параноя след прочитане на тази статия. Също така силно се препоръчва да направите резервно копие на базата данни, която се редактира, преди всякакви манипулации.

Работа с бази

За работа с бази данни има много различен софтуер както за компютри, така и за устройства с Android. Базите данни на приложенията обикновено се намират в /data/data/NAME ПАКЕТ APPS/бази данни. Можете да разберете името на пакета на приложението, което ви интересува, като отидете на "Настройки -> Приложения -> Всички" и изберете този, от който се нуждаете (ще се отвори разделът "Относно приложението") или в адресната лента на браузър на страницата на приложението в Play Market.

За да влезете в самата директория /data/data, имате нужда от права на суперпотребител и Root Explorer ще свърши страхотна работа при прегледа на съдържанието. За по-удобна работа, както и за редактиране на бази данни, можете да използвате например SQLite Debugger на устройството и DB Browser за SQLite на компютъра. За да работите с бази данни, имате нужда и от инсталиран BusyBox с аплета sqlite3. Всички манипулации в статията се извършват на Nexus 5 с фърмуер 5.1. Базите данни, достъпни за преглед и редактиране, разбити по съответните програми, могат да бъдат прегледани на устройството в същата програма за отстраняване на грешки SQLite чрез натискане на менюто App на главния екран. И така, с какво базите могат да бъдат полезни за вас на първо място и какво може да открадне нападателят? Нека се опитаме да го разберем.

ИНФО

Много благодаря на demosfenus за помощта при писането на SQL заявки.

accounts.db

Той се намира в /data/system/ или /data/system/users/0 в зависимост от версията на фърмуера и съдържа информация за всички акаунти, регистрирани на устройството. Както можете да видите на екранната снимка „Структура на акаунти.db“ в таблицата с акаунти, петнадесет акаунта на различни програми са свързани към моето устройство. Входовете са посочени за почти всички, за някои има пароли (на фигурата частта е изтрита) в криптиран вид.


Таблицата с токени за удостоверяване съдържа токени за оторизация от приложения, всички услуги на Google, GMS и други приложения. В раздела Екстри - допълнителни ключове и стойности, като GoogleUserId и списък със свързани приложения/услуги. Имам около петдесет, включително Talk, YouTube, URL shortener, Wallet и други.


Няма да кажа дали нападателят може да декриптира пароли от базата данни, но можете да получите достъп до услугите, като просто хвърлите базата данни на друго устройство. Нека се опитаме да проведем такъв експеримент. Нека вземем основата от смартфон Nexus 5 и таблет Nexus 7 с чиста система (прясно инсталирана 5.1 чрез flash-all.bat с клавиша -w, след това root). След като заредите чиста система, щракнете върху „Пропускане“, когато бъдете подканени да добавите акаунт, след което инсталирайте целия софтуер, посочен в accounts.db (WhatsApp не поддържа официално работа на таблети, така че изтеглете APK от warezniki или 1mobile.com). След това пускаме базата данни от смартфона, поставяме я в директорията /data/system/users/0 на таблета и рестартираме.

След изтеглянето виждаме, че нашият акаунт в Google се появи в раздела „Настройки -> Профили“ и ни даде пълен достъп до всички свързани програми. Поща, с която можете да промените паролата за акаунта си, всички контакти с телефонни номера, Google+, снимки, файлове в Google Drive, бележки, запазени оторизации в мобилен Chrome и т.н. Единственият неприятен момент е неработещият Play Market, който издава: "Възникна грешка при получаване на данни от сървъра rpc: s-7: aec-7". Търсейки в Google текста на грешката, можете лесно да я реанимирате.

Други приложения се държаха по различен начин:

Заключение: последните три програми са лесни за достъп, ако премахнете данните от accounts.db или самата база данни.

mmssms.db

И тук е цялата ни SMS-кореспонденция. Намира се по пътя /data/data/com.android.providers.telephony/databases/. Нека се опитаме да променим нещо. Например, нека вземем SMS от номер 900 - това е информатор на Сбербанк. На екранната снимка "SMS от Сбербанк преди и след намеса в mmssms.db" вляво, последното съобщение: "ECMC6844 02.05.15 12:49 покупка 450r 210009 KARI Баланс: 3281.16r". Нека го променим с по-интересно съобщение, показано вдясно. За да направите това, отворете базата данни на устройството в SQLite Debugger. Интересуваме се от sms таблицата. Изберете задължителните полета със заявка:

> ИЗБЕРЕТЕ _id, thread_id, адрес, дата, тяло FROM sms WHERE адрес = 900

Програмата има сензорно ориентиран интерфейс, а самите команди не е необходимо да се пишат ръчно. Те се заменят автоматично след извикване на менюто с дълго докосване на стойността или след щракване върху съответната дума в горния ред. Командите се показват за по-лесно използване в бъдеще (например при работа с конзолата или при извикване на скриптове с Tasker).


И така, като щракнете върху SELECT и отметнете необходимите полета, ще получим таблица, съдържаща номера на записа, номера на клон на разговора, номера на подателя, датата в UNIX време и самия SMS текст (вижте екранната снимка „Промяна на стойностите в mmssms .db база данни“). Дълго докосване на последния запис. Програмата предлага избор от действия. Изберете Актуализиране на стойност. Въвеждаме текста, от който се нуждаем. По аналогия с предишния SMS, ще се кредитираме с пари през банкомат. Нека променим текста на "ECMC6844 05.05.15 10:18 кредитиране на 1000000r ATM 367700 Баланс: 1003731.16r". Самата заявка ще изглежда така:

> UPDATE sms SET body = "ECMC6844 05.05.15 10:18 записване 1000000r ATM 367700 Баланс: 1003731.16r" КЪДЕ _id = 196

Като щракнете върху триъгълника в горния десен ъгъл, ще направим промяна в линията. Нека коригираме часа от SMS текста (05/05/15 10:18) в полето за дата. Можете да използвате всеки UNIX преобразувател на време, например онлайн калкулатор unix time stamp. Съответната дата ще бъде 1430810300. Добавете три произволни цифри за милисекунди до края и поставете получената стойност в полето за дата.

> АКТУАЛИЗИРАНЕ на sms ЗАДАЙТЕ дата = 1430810300000 КЪДЕ _id = 196

Две команди могат да бъдат комбинирани в една чрез въвеждане на редактируеми полета с данни, разделени със запетаи. Щракнете върху бутона Commit в долния десен ъгъл и направете промени в базата данни. Да видим какво стана. На същата екранна снимка „SMS от Сбербанк преди и след намеса в mmssms.db“ вдясно можете да видите, че сега сме богати хора и имаме повече от милион в сметката си. Понякога трябва да изчистите данните на приложението, което обработва SMS, за да влязат в сила промените.


Нека се опитаме да добавим нов SMS към базата данни. За да направим това, ни трябват две таблици в базата данни: threads, която съхранява поредния номер и заглавието (последното съобщение) на разговора/нишката, и sms, която съхранява цялата останала информация. Има два варианта за събития.

Опция 1: Добавете SMS към съществуващ разговор.За да направите това, търсим в sms таблицата номера на клона на разговора - thread_id, съответстващ на номера на подателя. Както можете да видите на екранната снимка „Промяна на стойностите в базата данни mmssms.db“, това е числото 7 за информатора на Sberbank. Нека добавим нов ред към разговора, показан на предишната екранна снимка. Попълнете следните полета: thread_id - нишка/нишка на разговора; адрес - номер на подателя; лице - ако подателят е в списъка с контакти; дата - час на пристигане на SMS; прочетено - 1 за прочетено съобщение, 0 за непрочетено; тип - 1 входяща, 2 изходяща (има и 0 - изпратени и 4 - чернови); тяло - текст на съобщението. За да добавите нов ред към таблица, изпълнете следната команда:

ВЪВЕТЕ В sms (threadid, адрес, дата, прочетете, тип, тяло) СТОЙНОСТИ (7, 900, strftime("%s", "сега")*1000, 1, 1, "Текст на съобщение")

Стойността strftime("%s", "сега")*1000 се използва за вмъкване на текущото време. За да въведете конкретна дата и час, трябва да използвате UNIX време с тринадесет цифри. Резултатът може да се види на екранната снимка "Добавяне на нов SMS към съществуващ разговор".


Вариант 2: добавете нов SMS и създайте нова нишка за разговор.Ако по аналогия добавите ред с нов номер +7123456789, който не е в адресната книга и с който не е имало кореспонденция преди, тогава подателите ще покажат „Неизвестен подател“, без да посочват номера (вижте екранната снимка „Добавяне нов SMS и създаване на нов клон” вляво). За да избегнете това, също така е необходимо да свържете нишките и таблиците canonical_addresses. Първо, добавяме ред с число към canonical_addresses, като проверяваме наличието на това число в таблицата по пътя:

Продължава достъпно само за абонати

Вариант 1. Абонирайте се за "Хакер", за да прочетете всички материали на сайта

Абонаментът ще ви позволи да четете ВСИЧКИ платени материали на сайта през посочения период. Приемаме плащане с банкови карти, електронни пари и преводи от сметки на мобилни оператори.