Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Скрипт обновления базы данных / 4 сообщений из 4, страница 1 из 1
07.02.2014, 08:23
    #38552769
NOSC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт обновления базы данных
Всем привет.
Пишу софт для мобильников, недавно столкнулся с SQLite, при обновлении программы (если база то же обновляется) нужен скрипт обновления вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
-- add a FullNames column to Employees
ALTER TABLE "Employees" RENAME TO 'Employees_ME_TMP';
CREATE TABLE "Employees" (
"EmployeeID" int NOT NULL,
"LastName" varchar(20) NOT NULL,
"FirstName" varchar(10) NOT NULL,
"Title" varchar(30),
"TitleOfCourtesy" varchar(25),
"BirthDate" timestamp,
"HireDate" timestamp,
"Address" varchar(60),
"City" varchar(15),
"Region" varchar(15),
"PostalCode" varchar(10),
"Country" varchar(15),
"HomePhone" varchar(24),
"Extension" varchar(4),
"Photo" blob,
"Notes" text,
"ReportsTo" int,
"PhotoPath" varchar(255),
"FullName" varchar(150),
PRIMARY KEY ("EmployeeID")
);
INSERT INTO "Employees"  ("EmployeeID", "LastName", "FirstName", "Title", "TitleOfCourtesy", "BirthDate", "HireDate", "Address", "City", "Region", "PostalCode", "Country", "HomePhone", "Extension", "Photo", "Notes", "ReportsTo", "PhotoPath", "FullName") SELECT "EmployeeID", "LastName", "FirstName", "Title", "TitleOfCourtesy", "BirthDate", "HireDate", "Address", "City", "Region", "PostalCode", "Country", "HomePhone", "Extension", "Photo", "Notes", "ReportsTo", "PhotoPath", "FirstName" || ' ' || "LastName" FROM "Employees_ME_TMP";
DROP TABLE "Employees_ME_TMP";



Возникает вопрос, поскольку базу для программы я заполняю изначально, есть ли такой менеджер баз данных, который бы автоматом генерировал подобный скрипт??

Спасибо.

P.S. Если пишу что-то не так или не ясно - говорите, терминологией не владею, за что прошу прощения.
...
Рейтинг: 0 / 0
07.02.2014, 12:32
    #38553119
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт обновления базы данных
ищите продукты типа такого

http://fmpromigrator.com/products/sqlite_diff/index.html
...
Рейтинг: 0 / 0
07.02.2014, 19:17
    #38554021
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт обновления базы данных
NOSCВозникает вопрос, поскольку базу для программы я заполняю изначально, есть ли такой менеджер баз данных, который бы автоматом генерировал подобный скрипт??Есть. Любой data modeler.

Впрочем, я не знаю в каком из них есть полноценная поддержка sqlite. Но можно попробавть на абстрактных моделях поработать - если не использовать sqlite фишки а ограничиваться стандартным sql-92 то любой DM пойдет.

NOSCP.S. Если пишу что-то не так или не ясно - говорите, терминологией не владею, за что прошу прощения.учи. Не знание терминологии мешает исключительно тому кто не знает.
...
Рейтинг: 0 / 0
10.02.2014, 09:51
    #38555308
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрипт обновления базы данных
NOSC,

По-моему автоматом генерить подобные скрипты опасно и в общем случае наверно это сделать не возможно (всякие триггера и прочее).
думаю правильнее хранить номер версии модели базы данных
и в коде инициализации отрабатывать все alter-ы в зависимости от версии.

В твоем примере ты создаешь временную таблицу.
1. не эффективно особенно если таблица будет иметь большой размер
2. нужно перед накатом убедиться, что таблица уже не содержит этой колонки.
3. если есть индексы/триггера то они похерятся.


Я бы в этом случае вообще обошелся без временной таблицы
Код: sql
1.
2.
ALTER TABLE Employees add column FullNames varchar(150);
update Employees set = FirstName || ' ' || LastName;



Если колонка уже есть - альтер кинет исключение - его можно поймать ниже и апдейт естественно не делать.

В общем я у себя миграцию сделал вот таким способом - пока полет нормальный - в таблице fly_revision хранится версия программы.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
		const int l_rev = m_flySQLiteDB.executeint("select max(rev) from fly_revision");
		if (l_rev < 322)
		{
			safeAlter("ALTER TABLE fly_file add column hit int64 default 0");
			safeAlter("ALTER TABLE fly_file add column stamp_share int64 default 0");
			safeAlter("ALTER TABLE fly_file add column bitrate integer");
			sqlite3_transaction l_trans(m_flySQLiteDB);
			// рехеш всего музона
			m_flySQLiteDB.executenonquery("delete from fly_file where name like '%.mp3' and (bitrate=0 or bitrate is null)");
			l_trans.commit();
		}
		if (l_rev < 358)
		{
			safeAlter("ALTER TABLE fly_file add column ftype integer default -1");
			sqlite3_transaction l_trans(m_flySQLiteDB);
			m_flySQLiteDB.executenonquery("update fly_file set ftype=1 where ftype=-1 and "
			                              "(name like '%.mp3' or name like '%.ogg' or name like '%.wav' or name like '%.flac' or name like '%.wma')");
			m_flySQLiteDB.executenonquery("update fly_file set ftype=2 where ftype=-1 and "
			                              "(name like '%.rar' or name like '%.zip' or name like '%.7z' or name like '%.gz')");
			m_flySQLiteDB.executenonquery("update fly_file set ftype=3 where ftype=-1 and "
			                              "(name like '%.doc' or name like '%.pdf' or name like '%.chm' or name like '%.txt' or name like '%.rtf')");
			m_flySQLiteDB.executenonquery("update fly_file set ftype=4 where ftype=-1 and "
			                              "(name like '%.exe' or name like '%.com' or name like '%.msi')");
			m_flySQLiteDB.executenonquery("update fly_file set ftype=5 where ftype=-1 and "
			                              "(name like '%.jpg' or name like '%.gif' or name like '%.png')");
			m_flySQLiteDB.executenonquery("update fly_file set ftype=6 where ftype=-1 and "
			                              "(name like '%.avi' or name like '%.mpg' or name like '%.mov' or name like '%.divx')");
			l_trans.commit();
		}
		if (l_rev < 341)
		{
			sqlite3_transaction l_trans(m_flySQLiteDB);
			m_flySQLiteDB.executenonquery("delete from fly_file where tth_id=0");
			l_trans.commit();
		}
		if (l_rev < 365)
		{
			sqlite3_transaction l_trans(m_flySQLiteDB);
			m_flySQLiteDB.executenonquery("update fly_file set ftype=6 where name like '%.mp4' or name like '%.fly'");
			l_trans.commit();
		}



Полный код тут http://code.google.com/p/flylinkdc/source/browse/trunk/client/CFlylinkDBManager.cpp
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Скрипт обновления базы данных / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]