Перейти к публикации
Форум - ComputerCraft
Zer0Galaxy

Система управления базами данных MySQL

Рекомендованные сообщения

Данная версия системы управления базами данных (СУБД) под операционную систему OpenOS разработана для изучения особенностей работы реальной СУБД MySQL.

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

 

Для установки СУБД на ОС-компьютер выполните команду

pastebin run -f bS1kRJKw

Если в компьютере установлена интернет-карта, вы должны увидеть такой текст:

Добро пожаловать в программу установки СУБД MySQL
Выберите тип установки:
1. Серверная часть
2. Клиентская часть
3. Полная установка 

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

После загрузки всех необходимых файлов, программа предложит перегрузить компьютер. Но мы пока не будем перегружать, а рассмотрим содержимое файла etc/dbms.cfg

--Файл конфигурации СУБД MySQL
DBpath="/mysql_db/"
port=3306
password="" 

Параметр DBpath содержит путь к папке, в которой будут храниться создаваемые базы. Если эта папка отсутствует, то при запуске СУБД она будет создана автоматически. Измените этот параметр, если значение по умолчанию вас не устраивает.

Параметр port содержит номер порта, через который, я надеюсь, когда нибудь можно будет обратиться к СУБД по сети.

Параметр password призван защищать доступ к базам паролем, но эта опция пока не реализована и вряд ли когда нибудь будет.

Так же к серверной части относится собственно СУБД - файл boot/dbms.lua, который благодаря своему расположению стартует автоматически и работает в фоновом режиме, что позволяет запускать на одном компьютере и сервер и клиент.

Вот теперь настало время перегрузить компьютер.

 

В клиентскую часть входят библиотека lib/mysql.lua и программа-монитор bin/mysql_mon.lua предоставляющая доступ к базам данных из командной строки.

Библиотека mysql предоставляет следующие функции для работы с базами данных:

 

 

mysql.connect ( server , username , password ) --Открывает соединение с сервером MySQL и возвращает указатель на сессию
mysql.close (session) -- Закрывает соединение с сервером MySQL
mysql.data_seek(result, row_number) -- Перемещает внутренний указатель в результате запроса
mysql.error(session) --  Возвращает строку ошибки последней операции с MySQL
mysql.fetch_array(result , result_type)  --  Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба. 
mysql.fetch_assoc(result) --  Обрабатывает ряд результата запроса и возвращает ассоциативный массив.
mysql.fetch_row(result)  -- Обрабатывает ряд результата запроса и возвращает неассоциативный массив.
mysql.num_fields( result ) -- Возвращает количество полей результата запроса
mysql.num_rows( result ) -- Возвращает количество рядов результата запроса
mysql.query( query, session )  -- Посылает запрос MySQL--Строка запроса НЕ должна заканчиваться точкой с запятой
Если в функции, использующей указатель сессии, параметр session пропущен, будет использоваться последняя активная сессия
Подробное описание этих и других функций можно почитать на сайте.

 

 

При реализации функции query я сделал одно небольшое допущение: все служебные слова запроса следует писать строчными (маленькими) буквами.

SQL-монитор mysql_mon позволяет отправлять запросы к СУБД из командной строки. Я старался сделать его похожим на Command Line Client, поэтому объяснять суть его работы не вижу смысла. Для выхода из программы введите "exit".

Пример работы с СУБД:

 

 

Предположим, мы хотим создать базу данных пользователей форума с учетом их репутации. Для создания базы воспользуемся утилитой mysql_mon.

После запуска монитора вводим команду:

create database forum; 

Эта команда создаст новую базу данных с именем "forum". Команда должна заканчиваться точкой с запятой.

После создания базы, делаем ее активной для текущей сессии:

use forum; 

Создадим в этой базе таблицу users. Таблица будет содержать следующие поля:

- id - идентификатор пользователя (числовое);

- name - имя пользователя (строковое);

- rep - репутация (числовое).

Такая таблица создается командой:

create table users (id int auto_increment, name varchar, rep int); 

Создадим в таблице несколько записей командой:

insert into users (name, rep) values ('user_name', 'user_rep'); 

Поскольку полю id мы установили признак auto_increment, это поле заполняется автоматически.

Вот что у меня получилось:

post-7-0-62668800-1458812847_thumb.png

Просмотреть содержимое созданной таблицы можно выполнив команду

select * from users; 

Для выхода из mysql_mon введите команду exit (без точки с запятой)

post-7-0-93359300-1458813603_thumb.png

Теперь предположим, нам необходимо найти в этой базе тех пользователей, чья репутация превышает 2000, и расположить их в порядке возрастания репутации. Для этого можно воспользоваться уже известным mysql-монитором, а можно выполнить вот такой код:

local mysql=require("mysql") --подключаем библиотеку

-- пытаемся подключиться к sql-серверу
-- поскольку сервер находится на локальной машине, в параметрах ничего не указываем
local result=mysql.connect()
-- анализируем результат и, при необходимости, выдаем сообщение
if not result then print(mysql.error()) return end

-- открываем базу данных "forum"
result=mysql.query("use forum")
if not result then print(mysql.error()) return end

-- посылаем sql-запрос на получение выборки
result=mysql.query("select name, rep from users where rep>2000 order by rep")
if not result then print(mysql.error()) return end

-- преобразуем результат запроса в ассоциативный массив и выводим его построчно
for user in mysql.fetch_arrays(result, mysql.ASSOC) do
  print(user.name, user.rep)
end

-- закрываем соединение с сервером
mysql.close() 

 

 

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

Изменено пользователем Zer0Galaxy
  • Like 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

просвятите, где здесь файлик, который бы лексил, парсил и интерпретировал сикуэль?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Параметр password призван защищать доступ к базам паролем, но эта опция пока не реализована и вряд ли когда нибудь будет.

А как например то если с другого компа подключаются к базе.

Считай любой может приконектится к базе (зная ее название и порт).

Пароль не зря есть в оригинальной MySQL для этих целей.

 

 

 

mysql.connect ( server , username , password )

Зато тут есть атрибут password.

То есть все равно пароль задумывался изначально.

 

Но а в целом идея интересная (надо ее не забрасывать как многие интересные проекты), сам лично еще не ставил и не тестил, но по документации я понял что это cool :smile9:

Позже напишу статью в группе ВК про нее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

просвятите, где здесь файлик, который бы лексил, парсил и интерпретировал сикуэль?

http://pastebin.com/wHvKJFtk

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Здесь нет ни лексера, ни парсера. Только матч. Причем кривой. Вместо CREATE TABLE something ... пишем какую то дичь.

 

Здесь нет SQL.

Изменено пользователем LeshaInc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Здесь нет ни лексера, ни парсера. Только матч. Причем кривой. Вместо CREATE TABLE something ... пишем какую то дичь.

Здесь нет SQL.

Ну да. Всё чего Леша не понимает - дичь. А всё что дичь - не SQL
  • Like 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Ну да. Всё чего Леша не понимает - дичь. А всё что дичь - не SQL

 

Потому что если делаешь MySQL — описывай всю спецификацию на самом точном уровне. А то не MySQL, а MineSQL. Так же как с FTP. Сделал какую то фигню, которая ни капли не описывает из протокола FTP.

 

Все я там поинмаю. Обычный регексп, вместо полноценного воплощения языка. SQL — это не такой язык, который можно считывать простым регекспом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Эхх... если бы это была библиотека для работы с реальным sql... а так это просто подобие...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Эхх... если бы это была библиотека для работы с реальным sql... а так это просто подобие...

Ты имеешь в виду трансляцию sql-запросов в реальный мир? А разве Тоторо-банк не так работает? Изменено пользователем Zer0Galaxy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты имеешь в виду трансляцию sql-запросов в реальный мир? А разве Тоторо-банк не так работает?

PHP-скрипт на сервере, который как раз SQL-запросы и посылает. Банк сам ничегошеньки не делает, кроме посылания запросов к этому скрипту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты имеешь в виду трансляцию sql-запросов в реальный мир? А разве Тоторо-банк не так работает?

я думал с помощью либы можно связаться с реальным sql сервером и с ним уже общаться... но и создание своего сервера тоже хорошо :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×