powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Скрипт обновления базы данных
4 сообщений из 4, страница 1 из 1
Скрипт обновления базы данных
    #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
Скрипт обновления базы данных
    #38553119
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ищите продукты типа такого

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

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

NOSCP.S. Если пишу что-то не так или не ясно - говорите, терминологией не владею, за что прошу прощения.учи. Не знание терминологии мешает исключительно тому кто не знает.
...
Рейтинг: 0 / 0
Скрипт обновления базы данных
    #38555308
Фотография 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
4 сообщений из 4, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Скрипт обновления базы данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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