Lua + PostgreSQL

alex.morozov

Участник
Автор темы
126
11
Версия MoonLoader
Другое
Здравствуйте уважаемые пользователи форума. Недавно решил перевести Lua бота на PostgreSQL, с MySQL, но появились затруднения с этой идеей, в интернете тупо нету информации про это (либо я тупой, не смог найти). Спросил у бездарных ИИ-шек, они все выдавали какую то хуйню однотипную. Прошу вас помочь с этой идеей.

UPD: luarocks install luapgsql тоже не работает, выдает ошибку
 
Решение
Первым делом я с ним попробовал, не работало, ошибки выдавало. Мне ИИ-шка ответила мол нужны DLL файлы, спиздил их у самого PostgreSQL, и так даже таким образом не работало

upd: не могу скачать через lua-rocks, ругается на всякую хуйню, мол старая версия и т.д

Может кто отправить в архиве уже скачанный luasql.postgresql, буду очень благодарен
Потому что в постгресе у тебя скорее всего стоит х64 версия, а тебе нужно билдить под х86, я бы описал процесс всей этой сборки, но после всех этих мучений, не особо горю желанием. В архиве лежит библиотека под 12 версию постгреса, т.к только в ней я смог получить libpq.lib для сборки под х86, может более умные смешарики смогут под новые версии постгресса...

alex.morozov

Участник
Автор темы
126
11
Первым делом я с ним попробовал, не работало, ошибки выдавало. Мне ИИ-шка ответила мол нужны DLL файлы, спиздил их у самого PostgreSQL, и так даже таким образом не работало

upd: не могу скачать через lua-rocks, ругается на всякую хуйню, мол старая версия и т.д

Может кто отправить в архиве уже скачанный luasql.postgresql, буду очень благодарен
 
Последнее редактирование:

chromiusj

fullstack eblan
Модератор
5,816
4,108
Первым делом я с ним попробовал, не работало, ошибки выдавало. Мне ИИ-шка ответила мол нужны DLL файлы, спиздил их у самого PostgreSQL, и так даже таким образом не работало

upd: не могу скачать через lua-rocks, ругается на всякую хуйню, мол старая версия и т.д

Может кто отправить в архиве уже скачанный luasql.postgresql, буду очень благодарен
Потому что в постгресе у тебя скорее всего стоит х64 версия, а тебе нужно билдить под х86, я бы описал процесс всей этой сборки, но после всех этих мучений, не особо горю желанием. В архиве лежит библиотека под 12 версию постгреса, т.к только в ней я смог получить libpq.lib для сборки под х86, может более умные смешарики смогут под новые версии постгресса сбилдить, но если честно я не вижу смысла мучаться со всем этим, когда можно просто связать клиент игры с своим веб-сервисом (https://www.blast.hk/threads/64996/), в котором уже будет стоять своя прокладка под БД, где можно и ORM ставить, и т.п.
Пример кода:

Lua:
local db_env = nil
local db_conn = nil

function main()
    while not isSampAvailable() do wait(0) end
    local status, lib = pcall(require, "luasql.postgres")
    if not status then
        print("ОШИБКА: Не удалось загрузить luasql.postgres. Ошибка: " .. tostring(lib))
        return
    end
    sampRegisterChatCommand("dbtest", function()
        lua_thread.create(function()
            if db_conn then
                sampAddChatMessage("[DB] Соединение уже установлено. Для сброса используйте /dbclose.", 0xFFFF00)
                return
            end
            local luasql = require("luasql.postgres")
            db_env = luasql.postgres()
            if not db_env then
                print("ОШИБКА: Не удалось создать окружение luasql.")
                return
            end

            local conn, err = db_env:connect("test_db", "postgres", "228228")
            if not conn then
                print("ОШИБКА ПОДКЛЮЧЕНИЯ: " .. tostring(err))
                if db_env then db_env:close() end
                db_env = nil
                return
            end
            db_conn = conn
            sampAddChatMessage("[DB] Успешно подключено!", 0x00FF00)

            local cursor, err_exec = db_conn:execute("SELECT nickname, score FROM players ORDER BY score DESC")
            if not cursor then
                print("ОШИБКА ЗАПРОСА: " .. tostring(err_exec))
                return
            end

            sampAddChatMessage("--- Игроки в базе данных ---", 0x00FFFF)
            local row = cursor:fetch({}, "a")
            while row do
                sampAddChatMessage(string.format("Ник: %s, Очки: %d", row.nickname, row.score), 0x00FFFF)
                row = cursor:fetch({}, "a")
            end
            cursor:close()
        end)
    end)

    sampRegisterChatCommand("dbclose", function()
        if db_conn then
            db_conn:close()
            db_conn = nil
        end
        if db_env then
            db_env:close()
            db_env = nil
        end
        sampAddChatMessage("[DB] Соединение с базой данных закрыто.", 0x00FF00)
    end)

    sampAddChatMessage("[DB] Скрипт загружен. Команды: /dbtest, /dbclose", 0x00FF00)
    wait(-1)
end

function onScriptTerminate(script, quitGame)
    if db_conn then db_conn:close() end
    if db_env then db_env:close() end
end

Пример таблицы в БД:
CREATE TABLE players (
    id SERIAL PRIMARY KEY,
    nickname VARCHAR(50) NOT NULL UNIQUE,
    score INT DEFAULT 0,
    last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
 

Вложения

  • luasql.rar
    7.3 KB · Просмотры: 1

alex.morozov

Участник
Автор темы
126
11
Потому что в постгресе у тебя скорее всего стоит х64 версия, а тебе нужно билдить под х86, я бы описал процесс всей этой сборки, но после всех этих мучений, не особо горю желанием. В архиве лежит библиотека под 12 версию постгреса, т.к только в ней я смог получить libpq.lib для сборки под х86, может более умные смешарики смогут под новые версии постгресса сбилдить, но если честно я не вижу смысла мучаться со всем этим, когда можно просто связать клиент игры с своим веб-сервисом (https://www.blast.hk/threads/64996/), в котором уже будет стоять своя прокладка под БД, где можно и ORM ставить, и т.п.
Пример кода:

Lua:
local db_env = nil
local db_conn = nil

function main()
    while not isSampAvailable() do wait(0) end
    local status, lib = pcall(require, "luasql.postgres")
    if not status then
        print("ОШИБКА: Не удалось загрузить luasql.postgres. Ошибка: " .. tostring(lib))
        return
    end
    sampRegisterChatCommand("dbtest", function()
        lua_thread.create(function()
            if db_conn then
                sampAddChatMessage("[DB] Соединение уже установлено. Для сброса используйте /dbclose.", 0xFFFF00)
                return
            end
            local luasql = require("luasql.postgres")
            db_env = luasql.postgres()
            if not db_env then
                print("ОШИБКА: Не удалось создать окружение luasql.")
                return
            end

            local conn, err = db_env:connect("test_db", "postgres", "228228")
            if not conn then
                print("ОШИБКА ПОДКЛЮЧЕНИЯ: " .. tostring(err))
                if db_env then db_env:close() end
                db_env = nil
                return
            end
            db_conn = conn
            sampAddChatMessage("[DB] Успешно подключено!", 0x00FF00)

            local cursor, err_exec = db_conn:execute("SELECT nickname, score FROM players ORDER BY score DESC")
            if not cursor then
                print("ОШИБКА ЗАПРОСА: " .. tostring(err_exec))
                return
            end

            sampAddChatMessage("--- Игроки в базе данных ---", 0x00FFFF)
            local row = cursor:fetch({}, "a")
            while row do
                sampAddChatMessage(string.format("Ник: %s, Очки: %d", row.nickname, row.score), 0x00FFFF)
                row = cursor:fetch({}, "a")
            end
            cursor:close()
        end)
    end)

    sampRegisterChatCommand("dbclose", function()
        if db_conn then
            db_conn:close()
            db_conn = nil
        end
        if db_env then
            db_env:close()
            db_env = nil
        end
        sampAddChatMessage("[DB] Соединение с базой данных закрыто.", 0x00FF00)
    end)

    sampAddChatMessage("[DB] Скрипт загружен. Команды: /dbtest, /dbclose", 0x00FF00)
    wait(-1)
end

function onScriptTerminate(script, quitGame)
    if db_conn then db_conn:close() end
    if db_env then db_env:close() end
end

Пример таблицы в БД:
CREATE TABLE players (
    id SERIAL PRIMARY KEY,
    nickname VARCHAR(50) NOT NULL UNIQUE,
    score INT DEFAULT 0,
    last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
спасибо большое, у меня винда х64, я не помню какую версию скачивал пг
 

chromiusj

fullstack eblan
Модератор
5,816
4,108
спасибо большое, у меня винда х64, я не помню какую версию скачивал пг
Версия винды не влияет на сборку, нужен только компилятор под необходимую битность библиотеки
 

alex.morozov

Участник
Автор темы
126
11
Потому что в постгресе у тебя скорее всего стоит х64 версия, а тебе нужно билдить под х86, я бы описал процесс всей этой сборки, но после всех этих мучений, не особо горю желанием. В архиве лежит библиотека под 12 версию постгреса, т.к только в ней я смог получить libpq.lib для сборки под х86, может более умные смешарики смогут под новые версии постгресса сбилдить, но если честно я не вижу смысла мучаться со всем этим, когда можно просто связать клиент игры с своим веб-сервисом (https://www.blast.hk/threads/64996/), в котором уже будет стоять своя прокладка под БД, где можно и ORM ставить, и т.п.
Пример кода:

Lua:
local db_env = nil
local db_conn = nil

function main()
    while not isSampAvailable() do wait(0) end
    local status, lib = pcall(require, "luasql.postgres")
    if not status then
        print("ОШИБКА: Не удалось загрузить luasql.postgres. Ошибка: " .. tostring(lib))
        return
    end
    sampRegisterChatCommand("dbtest", function()
        lua_thread.create(function()
            if db_conn then
                sampAddChatMessage("[DB] Соединение уже установлено. Для сброса используйте /dbclose.", 0xFFFF00)
                return
            end
            local luasql = require("luasql.postgres")
            db_env = luasql.postgres()
            if not db_env then
                print("ОШИБКА: Не удалось создать окружение luasql.")
                return
            end

            local conn, err = db_env:connect("test_db", "postgres", "228228")
            if not conn then
                print("ОШИБКА ПОДКЛЮЧЕНИЯ: " .. tostring(err))
                if db_env then db_env:close() end
                db_env = nil
                return
            end
            db_conn = conn
            sampAddChatMessage("[DB] Успешно подключено!", 0x00FF00)

            local cursor, err_exec = db_conn:execute("SELECT nickname, score FROM players ORDER BY score DESC")
            if not cursor then
                print("ОШИБКА ЗАПРОСА: " .. tostring(err_exec))
                return
            end

            sampAddChatMessage("--- Игроки в базе данных ---", 0x00FFFF)
            local row = cursor:fetch({}, "a")
            while row do
                sampAddChatMessage(string.format("Ник: %s, Очки: %d", row.nickname, row.score), 0x00FFFF)
                row = cursor:fetch({}, "a")
            end
            cursor:close()
        end)
    end)

    sampRegisterChatCommand("dbclose", function()
        if db_conn then
            db_conn:close()
            db_conn = nil
        end
        if db_env then
            db_env:close()
            db_env = nil
        end
        sampAddChatMessage("[DB] Соединение с базой данных закрыто.", 0x00FF00)
    end)

    sampAddChatMessage("[DB] Скрипт загружен. Команды: /dbtest, /dbclose", 0x00FF00)
    wait(-1)
end

function onScriptTerminate(script, quitGame)
    if db_conn then db_conn:close() end
    if db_env then db_env:close() end
end

Пример таблицы в БД:
CREATE TABLE players (
    id SERIAL PRIMARY KEY,
    nickname VARCHAR(50) NOT NULL UNIQUE,
    score INT DEFAULT 0,
    last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
он для raksamp lite подойдет?, у меня есть папка luasql в lib, там есть sqlite3.dll + mysql.dll, тот который я использовал

Раксамп вот это выдает
 

Вложения

  • Screenshot_35.png
    Screenshot_35.png
    4 KB · Просмотры: 12

chromiusj

fullstack eblan
Модератор
5,816
4,108
он для raksamp lite подойдет?, у меня есть папка luasql в lib, там есть sqlite3.dll + mysql.dll, тот который я использовал

Раксамп вот это выдает
тут я к сожалению не знаю, я собрал сейчас под х64, но ошибку выдает аналогичную
 

alex.morozov

Участник
Автор темы
126
11
тут я к сожалению не знаю, я собрал сейчас под х64, но ошибку выдает аналогичную
Я делаю фуллстак панель для управления ботом, и не могу выбрать вариант который окажется самым полезным. 1-й как то образом подключить ебучего слона в луа, либо сделать бота полностью зависимым от моего апи, и к примеру вызывать метод при запуске бота и сохранять настройки в словарь, что предложишь?
 

chromiusj

fullstack eblan
Модератор
5,816
4,108
Я делаю фуллстак панель для управления ботом, и не могу выбрать вариант который окажется самым полезным. 1-й как то образом подключить ебучего слона в луа, либо сделать бота полностью зависимым от моего апи, и к примеру вызывать метод при запуске бота и сохранять настройки в словарь, что предложишь?
Недавно, в ходе моей учебной практики(которую даже приняли) я реализовал подобную панель для раксампа на сервер на нод жс, вебсокеты+склайт ,но это было все со стороны сервера, клиент раксампа выступал просто как объектом передачи информации по типу местоположения,хп и т.д. Поэтому я бы предложил использовать аналогичный метод, но тут смотря для чего бд нужна вообще, в моем случае она нужна была для аутентификации пользователей(со стороны клиента никак не проверялась, была чисто как затычка,которая проверялась исключительно на сервере)
Я хоть и подозреваю, что вышеописанные мои действия являются настоящим костылем при такой работе, но других мыслей на тот момент не было, кроме как можно быстрее сдать работу
 

alex.morozov

Участник
Автор темы
126
11
Недавно, в ходе моей учебной практики(которую даже приняли) я реализовал подобную панель для раксампа на сервер на нод жс, вебсокеты+склайт ,но это было все со стороны сервера, клиент раксампа выступал просто как объектом передачи информации по типу местоположения,хп и т.д. Поэтому я бы предложил использовать аналогичный метод, но тут смотря для чего бд нужна вообще, в моем случае она нужна была для аутентификации пользователей(со стороны клиента никак не проверялась, была чисто как затычка,которая проверялась исключительно на сервере)
Я хоть и подозреваю, что вышеописанные мои действия являются настоящим костылем при такой работе, но других мыслей на тот момент не было, кроме как можно быстрее сдать работу
бд используется как главное хранилище для сайта и для бота, настройки бота для каждого сервера, профиль пользователей, лог активности (вышел, зашел, отправил команду), список серверов и т.д, как обычная бд, но идея была подключить слоника в том, что бы удобно было брать настройки, но я так вижу что в этой жизни у меня не получится такое сделать, по этому думаю апи будет лучше. +- мой бот играет такую же роль, тело, а апи сам мозг. Пробовал еще через сокеты, но они тоже не получились для бота, я не знаю, может я такой не везучий либо я такой рукожоп
 

kyrtion

Известный
1,194
438
бд используется как главное хранилище для сайта и для бота, настройки бота для каждого сервера, профиль пользователей, лог активности (вышел, зашел, отправил команду), список серверов и т.д, как обычная бд, но идея была подключить слоника в том, что бы удобно было брать настройки, но я так вижу что в этой жизни у меня не получится такое сделать, по этому думаю апи будет лучше. +- мой бот играет такую же роль, тело, а апи сам мозг. Пробовал еще через сокеты, но они тоже не получились для бота, я не знаю, может я такой не везучий либо я такой рукожоп
я предлагал бы иначе сделать так:
поднять сервер node.js (или bun) - этот сервер управит ботов
как инициализирует полностью и готов к работе - получить список аккаунтов и прокси в бд, затем запускать в raksamp и быть в курсе чтоб куратор знал, что бот умер/жив/выполнился/забанен и тд
 

alex.morozov

Участник
Автор темы
126
11
я предлагал бы иначе сделать так:
поднять сервер node.js (или bun) - этот сервер управит ботов
как инициализирует полностью и готов к работе - получить список аккаунтов и прокси в бд, затем запускать в raksamp и быть в курсе чтоб куратор знал, что бот умер/жив/выполнился/забанен и тд
а зачем тогда нужен сервер на fast api?
сам сервер на фаст апи предназначен для бота, клиентского функционала на сайте очень мало, просто аутентификация, выдача доступа, бан аккаунта и все, ну и самое главное это страница настроек бота
 
  • Нравится
Реакции: kyrtion

chromiusj

fullstack eblan
Модератор
5,816
4,108
бд используется как главное хранилище для сайта и для бота, настройки бота для каждого сервера, профиль пользователей, лог активности (вышел, зашел, отправил команду), список серверов и т.д, как обычная бд, но идея была подключить слоника в том, что бы удобно было брать настройки, но я так вижу что в этой жизни у меня не получится такое сделать, по этому думаю апи будет лучше. +- мой бот играет такую же роль, тело, а апи сам мозг. Пробовал еще через сокеты, но они тоже не получились для бота, я не знаю, может я такой не везучий либо я такой рукожоп
Без имени.png

ну смотри, в моем случае это выглядело так, т.е схема была трехступенчатой: клиент - сервер - бд, т.к драйвера под бд для клиента не было, как и у тебя, но он в принципе то и не понадобится, т.к всю сетевую шнягу ты будешь осуществлять на сервере, в том числе и проверку полученных данных, что я и сделал, поэтому смотри сам, как будет удобнее, апишку подключать как раз для этого самого:
просто аутентификация, выдача доступа, бан аккаунта и все
 
  • Ха-ха
  • Влюблен
Реакции: alex.morozov и kyrtion