СПО в российских школах

Команда ALT Linux рассказывает о внедрении свободного программного обеспечения в школах России
Март 11, 2011

BASIC-256. Глава 19

Методические материалы
Автор: Владимир Черный

Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Владимир Черный.
Оглавление:

Где взять BASIC-256

Глава 19 Программирование баз данных

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

Что такое база данных

База данных, говоря упрощенно, — это организованная коллекция чисел, строк и информации другого типа. Наиболее известны базы данных реляционного типа. Реляционные базы данных состоят из четырех главных составляющих: таблиц, строк, колонок и отношений между ними (связей, см табл 8).

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

Таблица 8 Главные компоненты реляционной базы данных.

Язык SQL

Большинство реляционных баз данных сегодня используют язык, называемый SQL для выбора и управления данными. SQL это акроним от Structured Query Language — Структурированный язык запросов. Первый SQL язык был разработан IBM в 1970 году и стал главным языком используемым в реляционных базах.

SQL достаточно мощный язык и был реализован многими компаниями за все годы с момента появления. В результате такого многообразия появилось и используется множество различных диалектов языка SQL. BASIC-256 использует SQLite в качестве системы управления базой данных. Пожалуйста ознакомьтесь с диалектом этого SQL языка на веб-странице SQLite: http://www.sqlite.org, поскольку данный диалект используется в приведенных ниже примерах.

Создание базы и добавление данных в нее

SQLite база данных не требует установки сервера или создания какой-то сложной системы. База данных и все ее части хранятся в простом файле на вашем компьютере. Этот файл можно скопировать на другой компьютер и использовать там без проблем. Первая программа (программа 102. Создаем базу данных) создает новый файл базы данных и таблицы. Таблицы представлены на ER-диаграмме (см. рис.34)


Рисунок 34 ER-диаграмма базы данных


 1 # chapter 19 dbcreate.kbs
 2 # Удаляем прежний файл базы данных и создаем базу с двумя таблицами
 3 errors = 0
 4 file$ = "pets.sqlite3"
 5 if exists(file$) then kill(file$)
 6 dbopen file$
 7
 8 stmt$ = "CREATE TABLE owner (owner_id INTEGER, ownername TEXT, phonenumber TEXT, PRIMARY KEY (owner_id));"
 9 gosub execute
10
11 stmt$ = "CREATE TABLE pet (pet_id INTEGER, owner_id INTEGER, petname TEXT, type TEXT, PRIMARY KEY (pet_id), FOREIGN KEY (owner_id) REFERENCES owner (owner_id));"
12 gosub execute
13
14 # Закрываем все.
15 dbclose
16 print file$ + " создан. " + errors + " ошибок."
17 end
18
19 execute:
20 print stmt$
21 onerror executeerror
22 dbexecute stmt$
23 offerror
24 return
25
26 executeerror:
27 errors = errors + 1
28 print "ERROR: " + lasterror + " " + lasterrormessage + " " + lasterrorextra
29 return

Программа 102 Создаем базу данных


CREATE TABLE owner (owner_id INTEGER, ownername TEXT, phonenumber TEXT, PRIMARY KEY (owner_id));
CREATE TABLE pet (pet_id INTEGER, owner_id INTEGER, petname TEXT, type TEXT, PRIMARY KEY (pet_id), FOREIGN KEY (owner_id) REFERENCES owner (owner_id));
pets.sqlite3 создан. 0 ошибок.

Пример вывода программы 102 Создаем базу данных

В приведенной выше программе вы видели три новых функции для работы с базами данных: dbopen – открывает файл базы данных или создает новый, если файл не существует, dbexecute – выполняет SQL команду на открытой базе данных, и dbclose – закрывает открытый файл базы данных.

dbopen имя_файла

Открывает файл SQLite базы данных. Если база не существует, создается пустой файл базы данных.

dbexecute sql-запрос

Выполняет sql-запрос на текущей открытой базе данных. Эта функция не возвращает данных, но возможно перехватить ошибку, если таковая возникнет в процессе выполнения запроса.

dbclose

Закрывает текущий открытый файл SQLite базы данных. Эта функция гарантирует, что все данные будут записаны в файл базы.

Эти же три функции можно использовать и для выполнения других SQL запросов к базе. Например, вставка новых строк в таблицы (см программу 103) с помощью INSERT INTO и обновление имеющихся строк таблицы с помощью SQLзапроса UPDATE (см. программу 104).

 1 # chapter19 dbinsert.kbs
 2 # add rows to the database
 3
 4 file$ = "pets.sqlite3"
 5 dbopen file$
 6
 7 owner_id = 0
 8 pet_id = 0
 9
10 ownername$ = "Джим": phonenumber$ = "555-3434"
11 gosub addowner
12 petname$ = "Пятнышко": type$ = "Кот"
13 gosub addpet
14 petname$ = "Фред": type$ = "Кот"
15 gosub addpet
16 petname$ = "Элвис": type$ = "Кот"
17 gosub addpet
18
19 ownername$ = "Сью": phonenumber$ = "555-8764"
20 gosub addowner
21 petname$ = "Альфред": type$ = "Кот"
22 gosub addpet
23 petname$ = "Фидо": type$ = "Собака"
24 gosub addpet
25
26 ownername$ = "Эми": phonenumber$ = "555-9932"
27 gosub addowner
28 petname$ = "Домино": type$ = "Собака"
29 gosub addpet
30
31 ownername$ = "Ди": phonenumber$ = "555-4433"
32 gosub addowner
33 petname$ = "Сэм": type$ = "Козел"
34 gosub addpet
35
36 # закрываем все
37 dbclose
38 end
39
40 addowner:
41 owner_id = owner_id + 1
42 stmt$ = "INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (" + owner_id + "," + chr(34) + ownername$ + chr(34) + "," + chr(34) + phonenumbe r$ + chr(34) + ");"
43 print stmt$
44 onerror adderror
45 dbexecute stmt$
46 offerror
47 return
48
49 addpet:
50 pet_id = pet_id + 1
51 stmt$ = "INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (" + pet_id + "," + owner_id + "," + chr(34) + petname$ + chr(34) + "," + chr(34) + type$ + chr(34) + ");"
52 print stmt$
53 onerror adderror
54 dbexecute stmt$
55 offerror
56 return
57
58 adderror:
59 print "ERROR: " + lasterror + " " + lasterrormessage + " " + lasterrorextra
60 return

Программа 103 Вставка строк в базу данных

INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (1,"Джим","555-3434");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (1,1,"Пятнышко","Кот");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (2,1,"Фред","Кот");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (3,1,"Элвис","Кот");
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (2,"Сью","555-8764");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (4,2,"Альфред","Кот");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (5,2,"Фидо","Собака");
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (3,"Эми","555-9932");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (6,3,"Домино","Собака");
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (4,"Ди","555-4433");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (7,4,"Сэм","Козел");

Пример вывода программы 103 Вставка строк в базу данных

 1 # chapter 19 dbupdate.kbs
 2 # Обновление данных
 3
 4 dbopen "pets.sqlite3"
 5
 6 # create and populate
 7 s$ = "UPDATE owner SET phonenumber = " + chr(34) + "555-5555" + chr(34) + " where owner_id = 1;"
 8 print s$
 9 dbexecute s$
10 dbclose

Программа 104 Обновление данных строки


UPDATE owner SET phonenumber = "555-5555" where owner_id = 1;

Пример вывода программы 104 Обновление данных строки

Получение информации из базы данных

Итак, мы умеем открывать и закрывать файл базы данных, а также исполнять SQL-запрос, который не возвращает данных. База данных, из которой нельзя получить информацию достаточно бесполезна.

Оператор SELECT (выбор) языка SQL позволяет нам получать необходимые данные. После выполнения SQL-запроса содержащего оператор SELECT создается набор записей, содержащих информацию из строк и столбцов таблиц базы данных. Программа 105 демонстрирует три различных запроса на выборку данных и как BASIC-256 программа может их использовать.

 1 # chapter 19 dbselect.kbs
 2 # Get data from the pets database
 3
 4 dbopen "pets.sqlite3"
 5
 6 # Показываем владельцев и номера их телефонов
 7 print "Владельцы и номера телефонов"
 8 dbopenset "SELECT ownername, phonenumber FROM owner ORDER BY ownername;"
 9 while dbrow()
10     print dbstring(0) + " " + dbstring(1)
11 end while
12 dbcloseset
13
14 print
15
16 # Показываем вадельцев и их питомцев
17 print "Владельцы и питомцы"
18 dbopenset "SELECT owner.ownername, pet.pet_id, pet.petname, pet.type FROM owner JOIN pet ON pet.owner_id = owner.owner_id ORDER BY ownername, petname;"
19 while dbrow()
20     print dbstring(0) + " " + dbint(1) + " " + dbstring(2) + " " + dbstring(3)
21 end while
22 dbcloseset
23
24 print
25
26 # Показываем среднее значение количества питомцев
27 print "Среднее количество питомцев"
28 dbopenset "SELECT AVG(c) FROM (SELECT COUNT(*) AS c FROM owner JOIN pet ON pet.owner_id = owner.owner_id GROUP BY owner.owner_id) AS numpets;"
29 while dbrow()
30     print dbfloat(0)
31 end while
32 dbcloseset
33
34 # Закрываем все
35 dbclose

Программа 105 Получение данных из базы


Владельцы и номера телефонов
Джим 555-5555
Ди 555-4433
Сью 555-8764
Эми 555-9932

Владельцы и питомцы
Джим 1 Пятнышко Кот
Джим 2 Фред Кот
Джим 3 Элвис Кот
Ди 7 Сэм Козел
Сью 4 Альфред Кот
Сью 5 Фидо Собака
Эми 6 Домино Собака

Среднее количество питомцев
1.75

Пример вывода программы 105 Получение данных из базы

dbopenset sql-запрос

Выполняет запрос на выборку данных (SELECT) из базы данных создавая набор строк как результат, так что программно можно их читать. Результатом запроса может быть 0 или более строк в зависимости от запроса.

dbrow

dbrow()

Читает очередную строку из набора строк сформированного функцией dbopenset. Если строчки кончились, возвращает false (ложь)

Для чтения первой строки из набора необходимо использовать dbrow сразу после dbopenset.

dbint (колонка)
dbfloat (колонка)
dbstring (колонка)

Эти функции возвращают данные из текущей строки запроса. Необходимо знать цифровой номер (начинающийся с нуля) колонки с необходимыми данными.

dbint Возвращает содержимое ячейки как целое
dbfloat Возвращает содержимое ячейки как десятичную дробь
dbstring Возвращает содержимое ячейки как строку.
dbcloseset

Закрывает и сбрасывает результат предыдущего запроса функции dbopenset

============================

Где скачать BASIC-256:

Для дистрибутивов ALT Linux

Windows версия
http://basic256.org (http://www.sourceforge.net/projects/kidbasic)

Как установить BASIC-256 в Linux

Для Альт Линукс: настроить репозиторий и обновить/установить пакет через synaptic или apt
Для rpm-based дистрибутивов: rpm -Uvh <имя_пакета>.rpm

Оставьте комментарий