ФорумПрограммированиеПыхнуть хотите?Готовые решения → goDB — библиотека работы с MySQL

goDB — библиотека работы с MySQL

  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 мая 2014 г. 14:57, спустя 31 минуту 45 секунд

    дуд всё убил.

    http://godb.ru/v1/
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 21 мая 2014 г. 14:59, спустя 2 минуты 48 секунд

    @vasa_c, нет гавнопхп тут места :-)

    Сапожник без сапог
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 21 мая 2014 г. 15:40, спустя 40 минут 58 секунд

    О сенькс, ты облегчил жизнь нескольким людям
  • KevinB

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 28 октября 2014 г. 14:36, спустя 159 дней 23 часа 55 минут

    При работе с либой столкнулся со следующими ситуациями:

    Ситуация 1:
    При выполнении запроса, когда плейсхолдеров в шаблоне запроса нет, а в $data есть некоторые данные (например, array('some_data' => 1), предполагается использование именованных плейсхолдеров), парсер ругается на различие в количестве плейсхолдеров и переданных параметров.
    Т.е. если мы используем именованые плейсхолдеры и количество плейсхолдеров меньше (но >0), чем переданных данных, то все замечательно. Но если снизить количество плейсхолдеров до 0, то возникает неоднозначность. Парсер считает что мы используем неименованые плейсхолдеры и кидает эксепшен.

    $db->query("SELECT * FROM users WHERE id = ?i:user_id", array('user_id' => 1)); //ok
    $db->query("SELECT * FROM users", array('user_id' => 1)); //Data elements (1) more than the placeholders (0)

    Возможно нужно игнорировать данные в случае отсутствия плейсхолдеров.
    (Для себя решил это постоянным пробрасыванием в шаблон названия таблицы, тем самым принудительно включая определение плейсхолдеров как именованные. $db->query("SELECT * FROM ?t:table", array('table' => 'users', 'user_id' => 1));
    Может стоило строже подходить к формированию данных)

    Ситуация 2:
    После каждого соединения с базой (postgres) мне нужно выполнить запрос:
    SET search_path TO web
    Конечно можно выполнять $db->query() сразу после создания объекта $db, но тогда теряется смысл lazy подключения.

    Было бы здорово иметь параметр в настройках (предположим, pre_queries) или метод ($db->preQuery()), который бы отложил выполнение запроса до момента первого "настоящего" запроса к базе.
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 28 октября 2014 г. 14:37, спустя 1 минуту 11 секунд

    @vasa_c, на тебя тут жалуются)

  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 28 октября 2014 г. 14:50, спустя 12 минут 54 секунды

    1. Зачем вообще что-то передавать в данных, если в запрос ничего не вставляется?

    2. Что это за запрос? Он какой-то особый или много разных может быть?
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 28 октября 2014 г. 15:14, спустя 23 минуты 13 секунд

    присоединяюсь
    1. Зачем вообще что-то передавать в данных, если в запрос ничего не вставляется?

    банально удобно

    Что это за запрос?

    он же написал
    SET search_path TO web
    но фактически это может быть любой конфигурационный запрос, например SET NAMES … COLLATE …
    не всё полезно, что в swap полезло
  • KevinB

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 28 октября 2014 г. 15:14, спустя 43 секунды

    1. Так получилось что запрос генерируется динамически в зависимости от входных параметров. Возникает ситуация когда плейсхолдеров нет, а в $params что-то находится.
    Пример, у меня есть метод выборки сообщений по параметрам
    function getMessages($params = array())

    туда передаю
    array(
    'topic' => 1,
    'date' => 564564,
    'admin' => true
    );

    если topic и date в запросе будут выглядеть как topic = ?i:topic , date > ?i:date,
    то admin будет интерпретирован как `user_id` IN (SELECT `id` FROM {users} WHERE `admin` = 1)
    и этот же массив $params кидаю в query
    Вот в случае когда я хочу выбрать любые сообщения админов без других параметров array('admin' => true), то оказывается что плейсхолдеров нет.
    Тут наверно нужно очищать от левых параметров, да.

    2. Пока нужен именно SET search_path TO web, он указывает в каких схемах по умолчанию искать таблицы (из той же серии, что SET NAMES в mysql)

  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 28 октября 2014 г. 15:19, спустя 4 минуты 12 секунд

    @KevinB, чтобы получателю приходило уведомление нужно делать вот так:
    @KevinB
    не всё полезно, что в swap полезло
  • KevinB

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 28 октября 2014 г. 15:23, спустя 4 минуты 2 секунды

    @KevinB, чтобы получателю приходило уведомление нужно делать вот так:
    @KevinB

    Благодарю

    @vasa_c,
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 29 октября 2014 г. 14:39, спустя 23 часа 16 минут 50 секунд

    1. Без плейсхолдеров не использовать данные - не вариант. Бывает плейсхолдер поставить забываю - нужно ошибку выкидывать.
    Какие-нибудь другие варианты можете предложить?

    Вообще, имхо, если шаблон меняете, то должны знать, нужны данные или нет.
    Может это поможет в некоторых случаях: https://github.com/vasa-c/go-db/wiki/Table

    2. Я в Pg не силён, для него другой чел адаптер делал, если на гитхабе тикет создать, может он придумает что.

    С SET NAMES в mysql было решено через конфиг: https://github.com/vasa-c/go-db/wiki/Adapters_mysql

    Но, в принципе и предварительные запросы тоже можно сделать.

    Спустя 278 сек.

    @KevinB :)
  • KevinB

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 29 октября 2014 г. 15:43, спустя 1 час 3 минуты 24 секунды

    @vasa_c,
    1. Не критично, можно данные проверять. Предлагаю закрыть вопрос.
    Table не подошли, во-первых быстрее самому написать запрос, во-вторых условие немного сложнее, чем просто что-то равное чему-то (больше, меньше, содержится в, равно полю из другой таблицы и тп).

    2. Ленивые конфигурационные запросы были бы кстати. Сегодня это set names, завтра установка часового пояса, послезавтра захочется логировать сам факт соединения и тп.
    Почему бы не дать разработчику такую возможность.
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 29 октября 2014 г. 15:52, спустя 9 минут 14 секунд

    2. Ленивые конфигурационные запросы были бы кстати. Сегодня это set names, завтра установка часового пояса, послезавтра захочется логировать сам факт соединения и тп.
    Почему бы не дать разработчику такую возможность.

    @KevinB, ИМХО, это выходит за рамки тех задач, которые решает GODB или любой другой аналогичный адаптор. Никто не мешает написать над GODB свой инициализирующий слой, если он нужен.
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 1 ноября 2014 г. 12:20, спустя 2 дня 20 часов 27 минут

    @KevinB,

    1. Сделал.
    Если в данных есть 0-й индекс, значит порядковые - ошибка.
    Нет, значит именованные.
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

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