myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 

> Mysql, win32 - API 2 | Самая распространённая база данных

Рейтинг 5 V
Setuper
сообщение 9.3.2009, 19:37
Сообщение #1


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




DLL библиотека для работы с базой данных MySQL 5.

Версия lua: 5.1
Версия API: 2
Разрядность ОС: 32
Протестировано на PtokaX 0.4.1.1

Копирайт: Copyright © 2003-2007 Kepler Project
LuaSQL is a simple interface from Lua to a DBMS
Версия: LuaSQL 2.1.1


В связи с непонятной работой sqlite предлагаю перейти на стабильную и отчасти более функциональную базу данных.
Хоть преимуществом sqlite и является работа на локальном компьютере и легкая переносимость, однако весь мир использует mysql и надо отдать должное - mysql великолепен!


Теперь о содержимом библиотеки.
Я прикладываю rar архив. В нём dll файл libmysql.dll и папка luasql с dll файлом mysql.dll. Обе эти дллелки нужны для работы бд.
Распаковываем архив в папку, где лежит файл ptokax.exe (или в папку libs), и ничего никуда не перемещаем.
После этого запускаем скрипт для тестирования.




Основные функции для работы с mysql в lua

  • Подключение драйвера (библиотеки):
    Код
    require"luasql.mysql"

  • Инициализация драйвера (библиотеки):
    Код
    env = luasql.mysql()

  • Деинициализация драйвера (библиотеки):
    Код
    env:close()
    Возвращает true в случае успешного закрытия, false в случае, если закрытие уже было сделано до этого.




Объект - соединение (conn)

  • Метод вызова соединения с базой данных:
    Код
    conn = env:connect([имя_базы], [имя_пользователя], [пароль], [хост], [порт])
    Обязательным является только первый параметр, остальные параметры в случае отсутствия берутся по умолчанию: [имя_пользователя] = "root", [пароль] = "", [хост] = "localhost", [порт] = 3306

  • Метод закрытия соединения с базой данных:
    Код
    conn:close()
    Закрытие может быть успешным только в случае если все курсоры закрыты. Возвращает true в случае успеха, false - в случае неудачи.

  • Метод выполнения (завершения, совершения) текущей транзакции:
    Код
    conn:commit()
    Возвращает true в случае успеха, false - в случае, когда транзакция не может быть завершина или база данных не поддерживает транзакции (поддержка транзакции в mysql осуществляется с версии 4.0).

  • Метод выполнения SQL запроса к базе данных:
    Код
    conn:execute("запрос")
    В случае правильности запроса, для запросов типа SELECT возвращает курсор, для остальных запросов возвращает число столбцов или строк, успешно обработанных запросом. В случае неверного синтаксиса, или несуществующих таблиц, или несуществующих полей возвращается два значения: первое - nil, второе - сообщение с содержанием ошибки.

  • Метод отката на предыдущую транзакцию:
    Код
    conn:rollback()
    Возвращает true в случае успеха, false - в случае, когда операция не может быть выполнена или база данных не поддерживает транзакции (поддержка транзакции в mysql осуществляется с версии 4.0).

  • Метод включения/отключения автоматических транзакций:
    Код
    conn:setautocommit(boolean)
    Эта функция не может работать на базах, на которых не осуществляются транзакции. На базах данных, на которых нет понятия режима автоматических транзакций, этот механизм осуществляется драйвером. Метод возвращает true в случае успеха, и false - в случае невыполнимости или неосуществимости (поддержка транзакции в mysql осуществляется с версии 4.0).



Объект - курсор (cur)

  • Метод закрытия курсора:
    Код
    cur:close()
    Возвращает true в случае успешного закрытия, false - в случае, если этот курсор уже закрыт.

  • Метод извлечения результатов:
    Код
    cur:fetch([table[,modestring]])
    Извлекает следующий столбец с результатами. Если метод вызывается без параметров, то результаты возвращаются непосредственно вызывающему оператору. Если в первом параметре метода указана таблица, то результаты помещаются в эту таблицу, и методом возвращается эта таблица, при этом может быть использован второй параметр. Второй параметр - это строка, которая указывает на то, как создавать результирующую таблицу:
    "n" - результирующая таблица будет содержать целочисленные индексы (это значение по умолчанию);
    "a" - результирующая таблица будет содержать словесные индексы.
    Целочисленные индексы являются номерами полей в SELECT запросе. Словесные индексы являются названиями полей в SELECT запросе. Дополнительный табличный параметр является таблицей, которую нужно использовать для сохранения следующей строки запроса. В частности, это допускает использование одной уникальной таблицы для всех выборок, и такой механизм может улучшить общее выполнение выборки в целом. Нет гарантии того, что извлечённые результаты будут преобразовываться в нужные в lua типы (в зависимости от содержания), то есть это говорит о том, что возвращаемые результаты всегда представляются в виде строковых значений будь это строка или число. Метод возвращает результирующую таблицу или nil, в случае если достигнута конечная строка. Здесь нужно отметить, что этот метод может возвращать nil, но тем не менее запрос будет выполнен правильно.

  • Метод, возвращающий таблицу с именами столбцов для данного курсора:
    Код
    cur:getcolnames()

  • Метод, возвращающий таблицу с типами столбцов для данного курсора:
    Код
    cur:getcoltypes()

  • Метод, возвращающий число строк, полученных в результате запроса:
    Код
    cur:numrows()




Как работать с таблицами для достижения большей производительности

  1. По возможности все поля декларировать как NOT NULL. Это сделает работу с таблицами более быстрой и сохранит 1 бит на каждое такое поле.
  2. Применять значения по умолчанию (DEFAULT). При вызове запроса INSERT в таблицу будут записываться только те поля, значения которых отличаются от DEFAULT.
  3. Используйте настолько малые типы INT, насколько это возможно. Например, применять MEDIUMINT намного лучше, чем обычный INT.
  4. Если у вас нет записей с переменной длиной ( ни одного поля с типом VARCHAR, BLOB или TEXT), то таблица сохраняется в формате " постоянной длиной записи ". Это несколько расходует память, но намного повышает скорость работы.
  5. При использовании нескольких последовательных INSERT запросов, лучше все данные указать в одном INSERT, чем делать несколько INSERT.
  6. При загрузке данных в таблицу лучше использовать LOAD DATA INFILE, чем INSERT, такой метод в 20 раз быстрее.
  7. Для увеличения скорости LOAD DATA INFILE и INSERT нужно увеличить значение переменной key_buffer.
  8. Если ожидается много запросов INSERT или UPDATE, работающих одновременно, то для большей скорости рекомендуется приметь LOCK TABLES.
  9. Время от времени нужно дефрагметировать таблицы. Это делается утилитой isamchk с опциями - evi.



--------------------

Если у вас нет mysql сервера, то качаем его, например отсюда: http://www.mysql.ru/download/ (файл mysql-5.0.67-win32.zip)
Для удобного администрирования там же можно скачать утилиту mysqlgui-win32-static
MySQL распространяется под GNU General Public License и под собственной коммерческой лицензией, на выбор.


Архив с библиотеками под PtokaX 0.4.*.*: Прикрепленный файл  mysql.rar ( 541.42 килобайт ) Кол-во скачиваний: 1673

Скрипт примера работы с MySQL в LUA: Прикрепленный файл  mysql_test.lua ( 1.63 килобайт ) Кол-во скачиваний: 458
Go to the top of the page
+Quote Post
4 страниц V   1 2 3 > »   
Начать новую тему
Ответов
Nickolya
сообщение 9.3.2009, 20:02
Сообщение #2


Главный ра******й тут...
*********

Группа: Главные администраторы
Сообщений: 1 727
Регистрация: 18.5.2008
Из: RF, 2la
Пользователь №: 1
Спасибо сказали: 776 раз




Угу, а где архив? big_smile.gif И есть ли хотя бы справка по функциям?
Go to the top of the page
+Quote Post
mariner
сообщение 9.3.2009, 21:27
Сообщение #3


Местная ТехПоддержка
**********

Группа: Администраторы
Сообщений: 1 875
Регистрация: 18.7.2008
Из: Моск. Обл, г. королев, район Болшево
Пользователь №: 221
Спасибо сказали: 220 раз




кстати, Илья (Я к сетаперу) - я так думаю, что тем же способом, что и sqlite, в линукс подрубается mysql! У меня require "luasql.mysql" без ошибок пашет big_smile.gif) PS пора делать скрипты с SQLite и MySQl!
Go to the top of the page
+Quote Post
Wariner
сообщение 9.3.2009, 21:42
Сообщение #4


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




надо токо пока не получается
Go to the top of the page
+Quote Post
Setuper
сообщение 9.3.2009, 22:03
Сообщение #5


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Простите, забыл приложить архив - исправлено big_smile.gif

mariner: я не сомневаюсь в этом. Именно эту самую библиотеку я и скомпилил под винду. Поэтому скрипты можно писать кроссплатформенные.
Go to the top of the page
+Quote Post
Wariner
сообщение 9.3.2009, 22:28
Сообщение #6


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




всё таки SQLite в каком то роде предпочтительнее, не все же имеют MySQL сервер....
Go to the top of the page
+Quote Post
Setuper
сообщение 9.3.2009, 22:40
Сообщение #7


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Поверь, "мускул" имеет гораздо большие возможности по сравнения со "скулой". Sqlite многие даже не считают за базу данных)))
Когда-то давно (2 года назад) я писал базы данных под MSSQL и под mysql и не знал, что существует какой-то там sqlite, потому как он не очень широко распространён среди программистов, которые пишут большие и стабильные программы на базе взаимодействия клиент-сервер.
Неужели так сложно поставить мускул? Инструкцию по установки что ли накатать?
Go to the top of the page
+Quote Post
Wariner
сообщение 9.3.2009, 23:26
Сообщение #8


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




думаю их полно в инете. Хотелось бы увидеть несколько скриптов с открытым кодом работающих с базой данных! Например простенький топ сообщений! Накидаешь Илюх? shame.gif
Go to the top of the page
+Quote Post
Setuper
сообщение 9.3.2009, 23:32
Сообщение #9


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Постараюсь в ближайшее время что-то подобного рода изобразить big_smile.gif
Go to the top of the page
+Quote Post
Wariner
сообщение 10.3.2009, 20:09
Сообщение #10


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Тестовый скрипт удачно запущен совместно с Денвером! Единственное базу пришлось создавать ручками.

PS: есть ли сайты повещённые взаимодействию MySQL и Lua?
Go to the top of the page
+Quote Post
Setuper
сообщение 10.3.2009, 20:24
Сообщение #11


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Базу естественно надо создавать вручную, а потом только к ней коннектиться. Для создания базы лучше всего использовать утилиту mysqlgui-win32-static (см. первый пост).

Всё что нужно знать по взаимодействию mysql и lua написано в первом посте.
Go to the top of the page
+Quote Post
Wariner
сообщение 10.3.2009, 20:42
Сообщение #12


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Цитата(Setuper @ 10.3.2009, 20:24) *
Всё что нужно знать по взаимодействию mysql и lua написано в первом посте.

упс не глянул пардон! я создал через phpMyAdmin

кстати mysqlgui-win32-static скачал ещё вчера. не работает она у меня(((
Go to the top of the page
+Quote Post
Setuper
сообщение 10.3.2009, 21:07
Сообщение #13


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Хм... странно из-за чего бы это ей не работать?
В общем базу можно создать многими способами, хоть через командную строку))))
Go to the top of the page
+Quote Post
mariner
сообщение 10.3.2009, 21:40
Сообщение #14


Местная ТехПоддержка
**********

Группа: Администраторы
Сообщений: 1 875
Регистрация: 18.7.2008
Из: Моск. Обл, г. королев, район Болшево
Пользователь №: 221
Спасибо сказали: 220 раз




да, командная строка наше фсио ) (я думаю ты уже догадался, что я console user) PS я готов выложить обновленные пакеты big_smile.gif)
Go to the top of the page
+Quote Post
alex82
сообщение 11.3.2009, 17:21
Сообщение #15


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




При выборке данных из таблицы числовые значения возвращаются как строки. Так и должно быть, или я что-то не так делаю?
Go to the top of the page
+Quote Post
Setuper
сообщение 11.3.2009, 17:23
Сообщение #16


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




да. Преобразование в нужные типы нужно делать самому, я об этом писал в первом посту (читай "Метод извлечения результатов")
Go to the top of the page
+Quote Post
Setuper
сообщение 14.3.2009, 14:23
Сообщение #17


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Свистопляска с кодировками MySQL

Начиная с версии 4.1 появилась возможность устанавливать кодировку на уровне сервера, базы данных, таблицы, столбца. Также появились переменные, которые определяют кодировку клиента (character_set_client), соединения (character_set_connection) и результата (character_set_results).

Например, когда вы добавляете данные в таблицу, MySQL проверяет кодировку клиента (вы можете посмотреть ее, проверив значение переменной character_set_client) и использует ее для определения того, в какой кодировке вы передаете серверу данные.

Переменная character_set_connection используется для определения кодировки для литералов, у которых она не определена и при преобразовании числа в строку.

Это значит, что если у вас данные в кодировке cp1251, то для корректной передачи данных необходимо чтобы character_set_client и character_set_connection были установлены в cp1251.

Во все три выше перечисленные параметры можно установить кодировку одним запросом к MySQL:
Код
SET NAMES cp1251
Это эквивалентно трём следующим командам:
Код
SET character_set_client=cp1251
SET character_set_connection=cp1251
SET character_set_results=cp1251


Однако, этой всей свистопляски можно и не делать если установить кодировки по умолчанию. Кодировки по умолчанию устанавливаются в файле my.ini, который находится в директории установленного вами мускула. В данном файле, в соответствующих "разделах", дописывается следующее:
Код
[client]

default-character-set=cp1251
character-sets-dir="C:/MySQL/share/charsets/"


Код
[mysql]

default-character-set=cp1251


Код
[mysqld]

default-character-set=cp1251
default-collation=cp1251_general_ci
character-sets-dir="C:/MySQL/share/charsets/"
init-connect='SET NAMES cp1251'


Внимание! Прописанная настройка init-connect, позволяет не прописывать каждый раз при коннекте к базе данных команду "SET NAMES cp1251", о которой говорилось выше, НО эта настройка не будет выполняться для пользователей, у которых есть привилегия SUPER.

Команда для просмотра кодировок:
Код
SHOW VARIABLES LIKE 'char%';

Использование:
Код
require"luasql.mysql"
local env = assert(luasql.mysql())
local con = assert(env:connect("название_бд", "пользователь", "пароль_пользователя", "localhost"))
local cur = assert(con:execute"SHOW VARIABLES LIKE 'char%'")
local row = cur:fetch({}, "n")
while row do
  Core.SendToAll(string.format("Variable_name: %s, Value: %s", row[1], row[2]))
  row = cur:fetch(row, "n")
end
cur:close()
con:close()
env:close()


И последнее...

При создании базы данных нужно также указывать кодировку создаваемой базы:
Код
CREATE DATABASE IF NOT EXISTS `my_dc_base` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;



Соблюдая все вышеизложенные факты, корректная работа базы данных обеспечена!


Спасибо сказали:
Go to the top of the page
+Quote Post
MEXAHuK
сообщение 15.3.2009, 6:49
Сообщение #18


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 314
Регистрация: 13.10.2008
Пользователь №: 791
Спасибо сказали: 9 раз




если у кого нить есть исходники птоки то можно переписать код чтобы она сразу работала с БД и не с хмл файлами. а в настройках просто добавить ещё 4 опции: адрес, имя пользователя, пароль, префикс таблиц...
Go to the top of the page
+Quote Post
alex82
сообщение 15.3.2009, 7:59
Сообщение #19


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата(MEXAHuK @ 15.3.2009, 5:49) *
если у кого нить есть исходники птоки то можно переписать код чтобы она сразу работала с БД и не с хмл файлами. а в настройках просто добавить ещё 4 опции: адрес, имя пользователя, пароль, префикс таблиц...
Исходники есть у PPK. Но он скорее всего пошлёт тебя если попросишь.

Если хорошо постараться, то можно и без исходников прикрутить к птоке MySQL.
Go to the top of the page
+Quote Post
MEXAHuK
сообщение 15.3.2009, 14:11
Сообщение #20


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 314
Регистрация: 13.10.2008
Пользователь №: 791
Спасибо сказали: 9 раз




и будет обычная птока только с плагином мускуля...
может кто нить напишет PPK что бы вышла птока которая не только как сервис, но как сервис с самостоятельным доступом к БД. а не через(пусть и хорошо написанный) плагин.
Go to the top of the page
+Quote Post

4 страниц V   1 2 3 > » 
Ответить в данную темуНачать новую тему
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts lua mysql
4 shadow3c 9 393 20.8.2014, 20:33 Посл. сообщение: shadow3c
No New Posts Topic has attachmentsmysql
RusHub | Библиотека базы данных mysql
8 Setuper 21 881 18.8.2014, 4:05 Посл. сообщение: shadow3c
No New Posts Mysql
Unix | База данных
11 Jaska 22 278 21.9.2013, 18:17 Посл. сообщение: KCAHDEP
No new Эффективность mysql
текстовый файл или mysql?
23 Iskandark 22 847 29.12.2011, 9:47 Посл. сообщение: mariner
No New Posts Скрипт антимат и антиреклама с базой в Mysql
1 Vizunchik 7 207 7.12.2011, 20:17 Посл. сообщение: Ksan
No New Posts RusHub and MySQL?! есть ли и как ...
вопросы про mysql, md5 hash и т.д.
4 DRUG_ADDICT 10 094 3.4.2011, 7:03 Посл. сообщение: alex82
No New Posts Topic has attachmentsCustomLocations + MySQL
Определяем провайдера по IP-адресу
0 alex82 7 131 7.3.2011, 18:39 Посл. сообщение: alex82
No New Posts Релизы/Заказы с MySQL
API 2 | MySQL
0 Kingston 5 457 6.2.2011, 10:08 Посл. сообщение: Kingston
No New Posts Topic has attachmentsУстановка и настройка Ubuntu 10.04 под PtokaX 4.1.2 с MySQL. Финал.
Инструкция для новичков в Линуксе
11 TiGRpp 29 411 2.9.2010, 5:09 Посл. сообщение: TiGRpp
No new Topic has attachmentsПоиск по TTH на MySQL
18 Lesh™ 21 595 15.8.2010, 12:40 Посл. сообщение: Lesh™
No New Posts От: Поиск по TTH на MySQL
От темы с ID: 3549
1 Lesh™ 6 685 14.7.2010, 0:30 Посл. сообщение: Lesh™
Closed Скрипт для внесени в данных в MySQL прям из чата командой.
Нужно маленький скриптик который будет экспортировать определенный тек
1 DEN 007 6 359 4.7.2010, 9:45 Посл. сообщение: Setuper
No New Posts От: Заявки на перевод скриптов под MySQL
От темы с ID: 1824
0 alev 5 383 25.4.2010, 12:05 Посл. сообщение: alev
No New Posts От: mysql
От темы с ID: 2952
3 derSpinner 6 606 13.4.2010, 11:41 Посл. сообщение: Setuper
No New Posts ВАЖНО: Topic has attachmentsЗаявки на перевод скриптов под MySQL
5 Wariner 13 799 4.4.2010, 15:18 Посл. сообщение: Accelerator

 



RSS Сейчас: 23.11.2024, 2:00