|
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
![]()
Сообщение
#41
|
|
![]() Самый главный активист :-D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз ![]() |
не это понятно, а дальше? мой мозг упорно хочет думать что по этому запросу будет содержание этих ячеек а выходит таблица
|
|
|
![]()
Сообщение
#42
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
http://mydc.ru/ipb.html?s=&showtopic=7...post&p=1995
Код local tMsg = DoFirstSelect("SELECT msg FROM table WHERE ip = 'ip2'")
Core.SendToAll(tostring(tMsg.ip)) |
|
|
![]()
Сообщение
#43
|
|
![]() Местный ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз ![]() |
Setuper
Можешь написать скриптик для тестирования проблемных запросов? |
|
|
![]()
Сообщение
#44
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Скрипт для тестирования SQLite:
![]() Ниже приведены результаты тестов для мною собранной библиотеки: ![]() Код Version sqlite: 3.6.11
CREATE TABLE test (id INTEGER PRIMARY KEY, content Text): true CREATE TABLE test2 (id INTEGER PRIMARY KEY, content Text): true INSERT INTO test (content) VALUES('value'): true INSERT INTO test (content) VALUES('value2'): true INSERT INTO test2 (content) VALUES('value'): false SELECT * FROM test: true SELECT * FROM test2: true DROP TABLE test2: false SELECT * FROM test2: false UPDATE test SET content='val' WHERE id='1': true SELECT content FROM test WHERE id='1': val |
|
|
![]()
Сообщение
#45
|
|
![]() Местный ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз ![]() |
Код [23:40:44] Version sqlite: 3.2.7 [23:40:44] CREATE TABLE test (id INTEGER PRIMARY KEY, content Text): true [23:40:44] CREATE TABLE test2 (id INTEGER PRIMARY KEY, content Text): true [23:40:44] INSERT INTO test (content) VALUES('value'): true [23:40:44] INSERT INTO test (content) VALUES('value2'): true [23:40:44] INSERT INTO test2 (content) VALUES('value'): true [23:40:44] SELECT * FROM test: true [23:40:44] SELECT * FROM test2: true [23:40:44] DROP TABLE test2: true [23:40:44] SELECT * FROM test2: false [23:40:44] UPDATE test SET content='val' WHERE id='1': true [23:40:44] SELECT content FROM test WHERE id='1': val Странно, но DROP работает. PS. Обьясни плиз блондинке(то бишь мне ![]() |
|
|
![]()
Сообщение
#46
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Функция CheckSelect проверяет возвращает ли запрос SELECT данные (возвращает true, если запрос возвращает данные и nil в противном случае).
Так то оно так, но вот попробуй вот такую проверку: Код function OnStartup() DoSql"CREATE TABLE test (id INTEGER PRIMARY KEY, content Text)" DoSql"CREATE TABLE test2 (id INTEGER PRIMARY KEY, content Text)" DoSql"DROP TABLE test2" DoSql"INSERT INTO test2 (content) VALUES('value')" db:close() end При правильной работе библиотеке результат должен быть следующим: Код CREATE TABLE test (id INTEGER PRIMARY KEY, content Text): true CREATE TABLE test2 (id INTEGER PRIMARY KEY, content Text): true DROP TABLE test2: true INSERT INTO test2 (content) VALUES('value'): false Я думаю, что у тебя не получится такого результата. Для просмотра базы данных используй sqlite браузер: ![]() |
|
|
![]()
Сообщение
#47
|
|
![]() Местный ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз ![]() |
Код [00:29:29] CREATE TABLE test (id INTEGER PRIMARY KEY, content Text): true [00:29:29] CREATE TABLE test2 (id INTEGER PRIMARY KEY, content Text): true [00:29:29] DROP TABLE test2: true [00:29:29] INSERT INTO test2 (content) VALUES('value'): false Именно такой и получился. Но при просмотре базы в браузере, таблица test2 присутствовала. |
|
|
![]()
Сообщение
#48
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Вот и я о том же.
Вообще какое-то странное поведение Я немного неверно написал в функции CheckSelect. Надо так: Код local function CheckSelect(request, no) local stmt=db:prepare(request) if stmt and stmt:first_row() then if bDebug then Core.SendToAll(request..": "..tostring(not no)) end return true end if bDebug then Core.SendToAll(request..": "..tostring(no or "false")) end return nil end Но просмотр через браузер говорит, что таблица не удаляется. Код DoSql"CREATE TABLE test (id INTEGER PRIMARY KEY, content Text)" DoSql"CREATE TABLE test2 (id INTEGER PRIMARY KEY, content Text)" DoSql"DROP TABLE test2" CheckSelect"SELECT * FROM test2" DoSql"CREATE TABLE test2 (id INTEGER PRIMARY KEY, content Text)" DoSql"INSERT INTO test2 (content) VALUES('value')" CheckSelect"SELECT * FROM test2" Результат: Код CREATE TABLE test (id INTEGER PRIMARY KEY, content Text): true
CREATE TABLE test2 (id INTEGER PRIMARY KEY, content Text): true DROP TABLE test2: true SELECT * FROM test2: false CREATE TABLE test2 (id INTEGER PRIMARY KEY, content Text): true INSERT INTO test2 (content) VALUES('value'): true SELECT * FROM test2: false |
|
|
![]()
Сообщение
#49
|
|
![]() Местный ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз ![]() |
Копнул либу чуть глубже.
Блин, такая же хрень, что и LuaSocket - большинство низкоуровневых функций написано на Lua. Отпало всякое желание копаться дальше в этом гуане. Переделал тестовый скрипт для вывода сообщений об ошибках вместо false. Код [12:13:53] DROP TABLE test2: database disk image is malformed [12:13:53] INSERT INTO test2 (content) VALUES('value'): database disk image is malformed Мдя... |
|
|
![]()
Сообщение
#50
|
|
![]() Самый главный активист :-D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз ![]() |
http://mydc.ru/ipb.html?s=&showtopic=7...post&p=1995 Код local tMsg = DoFirstSelect("SELECT msg FROM table WHERE ip = 'ip2'") Core.SendToAll(tostring(tMsg.ip)) я так понимаю должно быть: Код local tMsg = DoFirstSelect("SELECT msg FROM table WHERE ip = 'ip2'") Core.SendToAll(tostring(tMsg.msg)) сколько цифр может хранить тип NUMERIC? может конечно дело и не в этом. просто в SQL браузере я смотрю правильное количество шары, а скрипт выводит на порядок меньше 460995173 --выводит 34820733541 -- должно быть |
|
|
![]()
Сообщение
#51
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
В sqlite числовые типы служат только для сортировки, поэтому числа можно хранить и в текстовых полях. То есть под шару следует ставить тип TEXT
|
|
|
![]()
Сообщение
#52
|
|
![]() Самый главный активист :-D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз ![]() |
Есть вполне рабочий код:
Код function OnStartup() require "luasql.mysql" -- подключаем библиотеку env = assert (luasql.mysql()) -- вызываем основную функцию из библиотеки con = assert (env:connect("test","root","пароль","localhost")) -- соединяемся с базой данных res = assert (con:execute[[ CREATE TABLE IF NOT EXISTS MsgTop( Nick varchar(50) NOT NULL PRIMARY KEY, Msg MEDIUMINT(10) NOT NULL ) ]]) end function OnExit() --cur:close() con:close() env:close() end function ChatArrival(tUser, sData) local cur = assert(con:execute("SELECT Nick, Msg from MsgTop WHERE Nick = '"..tUser.sNick.."'")) row = cur:fetch ({}, "a") if not row then local res = assert(con:execute(string.format("INSERT INTO MsgTop VALUES ('%s', '%s')]], tUser.sNick, 1"))) else local iMsg = row.Msg + 1 local res = assert(con:execute("UPDATE MsgTop SET Msg = "..iMsg.." WHERE Nick = '"..tUser.sNick.."'")) end end Обычный топ сообщений. 2Setuper: Что можно исправить в самом коде(корявости и т.д.) и как сделать сортировку? позволяет ли MySQL автоматически сортировать таблицу или как всегда ручками! |
|
|
![]()
Сообщение
#53
|
|
![]() Местный ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз ![]() |
Код local iMsg = row.Msg + 1 local res = assert(con:execute("UPDATE MsgTop SET Msg = "..iMsg.." WHERE Nick = '"..tUser.sNick.."'")) А почему бы не сделать проще: Код assert(con:execute("UPDATE MsgTop SET Msg = Msg+1 WHERE Nick = '"..tUser.sNick.."'")) А сортировка, если я не ошибаюсь, производится так: Код con:execute("SELECT Nick, Msg from MsgTop ORDER BY Msg")
|
|
|
![]()
Сообщение
#54
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Сортировка:
Код SELECT select_expression FROM table WHERE where_definition ORDER BY col_name [ASC | DESC] Курсоры всегда нужно закрывать, если их используешь!!! Код require "luasql.mysql"
local env = assert(luasql.mysql()) local con = assert(env:connect("test","root","пароль","localhost")) assert(con:execute[[ CREATE TABLE IF NOT EXISTS `MsgTop`( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `Nick` VARCHAR(64) NOT NULL, `Msg` MEDIUMINT(10) NOT NULL DEFAULT 0, PRIMARY KEY(`id`), UNIQUE(`Nick`) ) ]]) function OnExit() con:close() env:close() end function ChatArrival(tUser, sData) con:execute(("INSERT INTO `MsgTop` (`Nick`) VALUES ('%s')"):format(tUser.sNick)) con:execute(("UPDATE `MsgTop` SET `Msg` = `Msg` + 1 WHERE `Nick` = '%s'"):format(tUser.sNick)) end |
|
|
![]()
Сообщение
#55
|
|
![]() Самый главный активист :-D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз ![]() |
Для чего нужен id? И ещё что нужно выделять апострофами а что нет? В доках по MySQL ничего конкретного вроде не нашёл....
upd: прошу ещё раз посмотреть всё ли норм написано))))) Есмли да то начну переделку некоторых своих скриптов))))
Прикрепленные файлы
|
|
|
![]()
Сообщение
#56
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
id - это индексированное поле. Служит для наискорейшего выполнения запросов.
Апострофами выделяются имена полей, таблиц, баз данных и тд. Выделять апострофами не обязательно, если имя уникально (не используется в синтаксисе sql), однако хорошие программисты, дабы не отвлекаться на эту мелочь, всегда выделяют все имена апострофами. Приведу пример: Код assert(con:execute"CREATE TABLE IF NOT EXISTS TABLE(`field` INT)") в данном случае запрос не выполнится и будет выдана ошибка, всё из-за того, что имя таблицы - TABLE, является ключевым словом sql. Однако если написать так: Код assert(con:execute"CREATE TABLE IF NOT EXISTS `TABLE`(`field` INT)") то запрос выполнится. Поэтому чтобы не отвлекаться и не проверять на совпадение с ключевыми словами, имена всех придуманных объектов заключаем в апострофы.По поводу скрипта: 1) Не закрыт курсор!!!!! 2) Ограничение можно делать в самом sql, используя LIMIT. ![]() |
|
|
![]()
Сообщение
#57
|
|
![]() Самый главный активист :-D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз ![]() |
Класс))))))))) вот токо я до сих пор не придумал таблицы((((
upd: как правильно сделать связь таблиц, где почитать? какой оператор? |
|
|
![]()
Сообщение
#58
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Ни в sqlite, ни в mysql нет полнеценной поддержки связей. Связи являются визуальными, но тем не менее они должны быть.
|
|
|
![]()
Сообщение
#59
|
|
![]() Самый главный активист :-D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз ![]() |
ну а если поконкретнее немного? что должна содержать 3 таблица(которая для связи)?
|
|
|
![]()
Сообщение
#60
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Смотря какой тип связи.
2 таблицы со связью многие-ко-многим связываются через третью таблицу. в третьей таблице находятся ссылка на ключи из двух других |
|
|
![]() ![]() |
Похожие темы
![]() |
Сейчас: 8.9.2024, 2:48 |