• Почему на почту приходит только один файл?

    @galaxy
    В дополнение отмечу, что мало кто понимает, как работает <input name="file" type="file" multiple="">.
    Почему-то думают, что если несколько раз нажать на кнопку загрузки, то и прикрепится несколько. На самом деле при каждом следующем нажатии и выборе нового файла старый затирается.

    Несколько файлов надо выбирать сразу через зажатый Ctrl.
    Ответ написан
    2 комментария
  • Ошибка при создании триггера..?

    @galaxy
    СУБД, конечно, указывать не обязательно, они же все одинаковые...

    Судя по всему, postgres. В таком случае извольте почитать документацию. Вы видите там возможность прямо в CREATE TRIGGER писать какие-либо DML запросы?

    В постгресе все действия триггера выполняются через специальную функцию (ссылки на примеры на разных языках - https://www.postgresql.org/docs/13/triggers.html), которую триггер должен вызывать.
    Ответ написан
    Комментировать
  • Какой SQL запрос написать?

    @galaxy
    SELECT Company, SUM(CASE WHEN IsDiscounted THEN Price ELSE -Price END) ...
    Ответ написан
    1 комментарий
  • Недостатки PostgreSQL?

    @galaxy
    Самая большая проблема - это архитектура MVCC, которая вызывает распухание таблиц, требует наличие vacuum'инга, и в многих случаях не способствует производительности.

    Но советую все же самому погуглить (для затравки - https://habr.com/ru/company/southbridge/blog/322624/). Будет гораздо проще и полезнее, если вы нагуглите какие-то особенности, а специалисты тут подскажут, насколько они актуальны и критичны.
    Ответ написан
    2 комментария
  • Не импортируется таблица через командную строку на сервере?

    @galaxy
    В вас дело.
    mysql -v запустило клиент mysql, и вы вытаетесь импортировать из командной строки mysql.
    Ответ написан
    Комментировать
  • Как организовать структуру хранения атрибутов?

    @galaxy
    Вообще, рассуждать в отрыве от данных достаточно бессмысленно. Надо смотреть конкретные планы запросов и время выполнения.
    Например, для статистики, которую вы приводили тут где-то (похоже, ответ уже потерли), у меня получаются вполне приемлемые результаты (на мой взгляд, не факт, что вас устроит):
    Схема и данные

    create table products (
    	id serial primary key,
    	name text not null
    );
    
    create table products_attributes (
    	id serial primary key,
    	attribute_id int not null,
    	product_id int not null references products (id),
    	value double precision
    );
    
    
    -- 10 млн продуктов
    insert into products (name)
    select 'p' || n from generate_series(1, 10000000) n;
    
    -- в среднем по 10 аттрибутов на продукт
    -- всего 20 разных аттрибутов
    -- значения - случайные из 1-1000
    insert into products_attributes(attribute_id, product_id, value)
    select a,
           p.id,
           trunc(random() * 1000)
      from products p, generate_series(1, 20) a
     where random() < 0.5;
    
    
    create index ix_attr_attribute_id on products_attributes(attribute_id);
    create index ix_attr_product_id on products_attributes(product_id);
    create unique index uk_attr_attr_product on products_attributes(product_id, attribute_id);
    create index ix_attr_value on products_attributes(value);
    
    -- немного статистики
    select attribute_id, count(*) from products_attributes group by 1 order by 1;
    
     attribute_id |  count
    --------------+---------
                1 | 5001345
                2 | 5001937
                3 | 4998754
                4 | 4998706
                5 | 4999357
                6 | 5004465
                7 | 4999215
    ...
    
    select product_id, count(*) from products_attributes group by 1 order by 2 desc limit 20;
     product_id | count
    ------------+-------
        4769292 |    20
        5366802 |    20
        7241348 |    20
        3019891 |    20
        7789046 |    20
        1688646 |    19
        1585970 |    19
    ...
    
    SELECT count(*) FROM products_attributes WHERE attribute_id = 1 AND value BETWEEN 1 AND 400;
      count
    ---------
     1999212
    (1 row)
    
    SELECT count(*) FROM products_attributes WHERE attribute_id = 2 AND value BETWEEN 1 AND 400;
      count
    ---------
     1999385
    (1 row)
    
    SELECT count(*) FROM products_attributes WHERE attribute_id = 3 AND value BETWEEN 20 AND 30;
     count
    -------
     55318
    (1 row)



    explain analyze
    select * from products
     where id in (
       select product_id from products_attributes
        where attribute_id = 1 AND value BETWEEN 1 AND 400
     )
     and id in (
       select product_id from products_attributes
        where attribute_id = 2 AND value BETWEEN 1 AND 400
     )
     and id in (
       select product_id from products_attributes
        where attribute_id = 3 AND value BETWEEN 20 AND 30
     );

    Без лимита, 2189 записей - 3.8 сек:
    План

    QUERY PLAN                          
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     Gather  (cost=164603.86..347381.12 rows=2047 width=12) (actual time=680.688..3753.927 rows=2189 loops=1)
       Workers Planned: 2
       Workers Launched: 2
       ->  Nested Loop  (cost=163603.86..346176.42 rows=853 width=12) (actual time=652.714..3713.617 rows=730 loops=3)
             ->  Nested Loop  (cost=163603.43..341334.66 rows=762 width=12) (actual time=652.439..3294.369 rows=730 loops=3)
                   ->  Parallel Hash Join  (cost=163602.86..313081.39 rows=4167 width=8) (actual time=649.437..1742.210 rows=3689 loops=3)
                         Hash Cond: (products_attributes_1.product_id = products_attributes_2.product_id)
                         ->  Parallel Index Scan using ix_attr_attribute_id on products_attributes products_attributes_1  (cost=0.57..147444.27 rows=775173 width=4) (actual time=0.577..880.079 rows=666462 loops=3)
                               Index Cond: (attribute_id = 2)
                               Filter: ((value >= '1'::double precision) AND (value <= '400'::double precision))
                               Rows Removed by Filter: 1000851
                         ->  Parallel Hash  (cost=163306.17..163306.17 rows=23690 width=4) (actual time=647.483..647.483 rows=18439 loops=3)
                               Buckets: 65536  Batches: 1  Memory Usage: 2752kB
                               ->  Parallel Index Scan using ix_attr_attribute_id on products_attributes products_attributes_2  (cost=0.57..163306.17 rows=23690 width=4) (actual time=18.296..639.541 rows=18439 loops=3)
                                     Index Cond: (attribute_id = 3)
                                     Filter: ((value >= '20'::double precision) AND (value <= '30'::double precision))
                                     Rows Removed by Filter: 1647812
                   ->  Index Scan using uk_attr_attr_product on products_attributes  (cost=0.57..6.78 rows=1 width=4) (actual time=0.420..0.420 rows=0 loops=11066)
                         Index Cond: ((product_id = products_attributes_1.product_id) AND (attribute_id = 1))
                         Filter: ((value >= '1'::double precision) AND (value <= '400'::double precision))
                         Rows Removed by Filter: 0
             ->  Index Scan using products_pkey on products  (cost=0.43..6.35 rows=1 width=12) (actual time=0.572..0.572 rows=1 loops=2189)
                   Index Cond: (id = products_attributes.product_id)
     Planning Time: 4.481 ms
     JIT:
       Functions: 93
       Options: Inlining false, Optimization false, Expressions true, Deforming true
       Timing: Generation 14.220 ms, Inlining 0.000 ms, Optimization 2.852 ms, Emission 50.889 ms, Total 67.961 ms
     Execution Time: 3762.035 ms
    (29 rows)



    То же, но с лимитом (LIMIT 20):
    Запрос
    explain analyze
    select * from products
     where id in (
       select product_id from products_attributes
        where attribute_id = 1 AND value BETWEEN 1 AND 400
     )
     and id in (
       select product_id from products_attributes
        where attribute_id = 2 AND value BETWEEN 1 AND 400
     )
     and id in (
       select product_id from products_attributes
        where attribute_id = 3 AND value BETWEEN 20 AND 30
     ) limit 20;


    20 записей - 48 мсек:
    spoiler
    QUERY PLAN                                   
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     Limit  (cost=2.14..7292.14 rows=20 width=12) (actual time=3.743..47.724 rows=20 loops=1)
       ->  Nested Loop  (cost=2.14..746133.39 rows=2047 width=12) (actual time=3.741..47.714 rows=20 loops=1)
             ->  Nested Loop  (cost=1.70..734511.89 rows=1829 width=12) (actual time=3.313..44.710 rows=20 loops=1)
                   ->  Nested Loop  (cost=1.14..666709.45 rows=10000 width=8) (actual time=2.377..42.276 rows=95 loops=1)
                         ->  Index Scan using ix_attr_attribute_id on products_attributes products_attributes_2  (cost=0.57..209246.27 rows=56856 width=4) (actual time=1.250..14.969 rows=511 loops=1)
                               Index Cond: (attribute_id = 3)
                               Filter: ((value >= '20'::double precision) AND (value <= '30'::double precision))
                               Rows Removed by Filter: 46859
                         ->  Index Scan using uk_attr_attr_product on products_attributes products_attributes_1  (cost=0.57..8.05 rows=1 width=4) (actual time=0.053..0.053 rows=0 loops=511)
                               Index Cond: ((product_id = products_attributes_2.product_id) AND (attribute_id = 2))
                               Filter: ((value >= '1'::double precision) AND (value <= '400'::double precision))
                               Rows Removed by Filter: 0
                   ->  Index Scan using uk_attr_attr_product on products_attributes  (cost=0.57..6.78 rows=1 width=4) (actual time=0.025..0.025 rows=0 loops=95)
                         Index Cond: ((product_id = products_attributes_1.product_id) AND (attribute_id = 1))
                         Filter: ((value >= '1'::double precision) AND (value <= '400'::double precision))
                         Rows Removed by Filter: 0
             ->  Index Scan using products_pkey on products  (cost=0.43..6.35 rows=1 width=12) (actual time=0.149..0.149 rows=1 loops=20)
                   Index Cond: (id = products_attributes.product_id)
     Planning Time: 9.959 ms
     Execution Time: 47.796 ms
    (20 rows)


    Как видите, оценки планировщика по селективности адекватные. Начинает он с самого высоко-селективного условия. Лимит проносится внутрь самых глубоких джойнов (видно по количеству записей).
    Ответ написан
    3 комментария
  • Какой UTF-8 (hex.) код у переноса на новую строку?

    @galaxy
    Стандартом Юникод определено из соображений обратной совместимости несколько символов (сочетаний символов), после которых идет обязательный переход на новую строку

    VT: Vertical Tab, U+000B
    FF: Form Feed, U+000C
    CR: Carriage Return, U+000D
    CR+LF: CR (U+000D) followed by LF (U+000A)
    LF: Line Feed (U+000A)
    NEL: Next Line, U+0085
    LS: Line Separator, U+2028
    PS: Paragraph Separator, U+2029


    (при этом эффект переноса для VT и NEL не обязателен к исполнению при реализации стандарта).

    На практике в UTF-8 для переноса строк обычно используются те же символы, что и в ASCII (они и кодируются так же, как в ASCII):
    • CR: Carriage Return, UTF-8: 0x0D
    • LF: UTF-8: 0x0A
    • CR+LF: UTF-8: 0x0D0A
    Ответ написан
    Комментировать
  • Firefox показывает некоторые HTTPS сайты как недоверенные. MITM атака провайдера?

    @galaxy
    Из-за кросс-подписи, скорее всего - https://letsencrypt.org/certificates/

    UPD: впрочем, я, видимо, неправ, это тут ни при чем
    Ответ написан
  • Как отправить запрос?

    @galaxy
    Никак. Requests не выполняет JS.
    Ответ написан
  • Не сохраняются параметры в sqlite3, что делать?

    @galaxy
    sql.execute("""CREATE TABLE IF NOT EXISTS users(
      id INT
      balance BIGINT
      name TEXT)""")

    В этом запросе запятые нужны:
    CREATE TABLE IF NOT EXISTS users(
      id INT,
      balance BIGINT,
      name TEXT)


    А так, да, из-за IF NOT EXISTS похоже, что осталась таблица со старой структурой и не пересоздается
    Ответ написан
    Комментировать
  • Почему при выходе добавляется \n?

    @galaxy
    Подозреваю, что не к любому, а к последнему добавляется. Потому, что в поле вводите с переводом строки в конце.
    Дальше этот перевод вас и преследует.
    На этапе str(zxcword) он уже закрепляется в виде эскейп-последовательности.
    >>> s = "мама,мыла,ламу\n"
    >>> print(s)
    мама,мыла,ламу
    
    >>> a = s.split(",")
    >>> a.sort()
    >>> a
    ['ламу\n', 'мама', 'мыла']


    Делайте strip():
    zxcword = entword.get(1.0, END).strip().split(",")

    и преобразуйте список в строку по-человечески (это на будущее):
    ",".join(zxcword)
    Ответ написан
    Комментировать
  • Из-за чего ошибка nodejs client password must be a string?

    @galaxy
    pasword:'password',

    точно ничего не замечаете?
    Ответ написан
    Комментировать
  • Никак не работает RedBeanPHP?

    @galaxy
    if(isset($data["send__button"])) {
    И откуда, спрашивается, в $_POST возьмется send__button? С чего вы решили, что данные отправляются исходя из класса?
    <button class="send__button" type="submit">Send</button>
    Ответ написан
    1 комментарий
  • Почему возникает "TypeError: not all arguments converted during bytes formatting"?

    @galaxy
    Тому що документацию надо читать.

    Второй параметр execute() должен быть tuple или dict. В вашем случае tuple задается вот так:
    cursor.execute("UPDATE hiveos SET status=0 WHERE id_farm=%s",('10',))

    (найдите отличие)

    С пятеркой все работает потому, что вместо tuple в принципе подойдет любой итерируемый объект, например, строка. Итерация по строке '5' выдает 1 шаг, а по строке '10' - два (значения '1' и '0')
    Ответ написан
    Комментировать
  • При работе с динамическим SQL ошибка недопустимый идентификатор, как можно исправить?

    @galaxy
    Литералы varchar надо кавычить:
    execute immediate 'update ' || tablename || ' set accli = ''' || rec.acode || ''', clcode= ''' || rec.clcode || '''';
    Ответ написан
    1 комментарий
  • Почему aes_decrypt возвращает неправильные данные?

    @galaxy
    aes_encrypt/aes_decrypt возвращают binary string. Подозреваю, что вы работаете из Питона и получаете литерал типа bytes

    >>> pas = b'acc2'
    >>> pas
    b'acc2'
    >>> type(pas)
    <class 'bytes'>
    >>> pas.decode('utf8')
    'acc2'
    >>>
    Ответ написан
  • Как получить ответ в переменную из json_decode?

    @galaxy
    Для начала, вставляйте код в вопрос через кнопку "Вставить код". Например, сейчас у вас парсер съел http:// в ссылке.

    Далее, этот дурацкий сайт возвращает невалидный JSON. Во-первых, он возвращает его в кодировке CP1251 (по стандарту должно быть UTF-8). Во-вторых, переносы строк, как и все контрольные символы, должны кодироваться.

    Ну и вы поставили (вторым параметром при вызове json_decode) возвращать результат, как массив. А работать пытаетесь с ним, как с объектом.

    $API = "http://rzhunemogu.ru/RandJSON.aspx?CType=1";
    $s = iconv("cp1251", "utf-8", file_get_contents($API));
    $s = str_replace(["\r", "\n"], ["\\r", "\\n"], $s);
    $o = json_decode($s);
    print $o->content;
    Ответ написан
    Комментировать
  • UTF-8 - для чего нужен 0 после единиц в ведущем байте?

    @galaxy
    Для чего нужен 0, если теоретически единиц достаточно для определения границ символа?

    Для удобства. По стартовому байту последовательности (кодирующей символ) можно определить ее длину в байтах: сколько единичных страших битов, столько и байт в последовательности. Ноль обозначает конец серии единичных старших бит. Если бы не было этого нуля, невозможно было бы сказать, сколько старших бит установлено в стартовом байте (пришлось бы считывать байты дальше до тех пор, пока не встретится следующий стартовый байт или однобайтовый символ).
    Т.е. допустим, вы видите такую последовательность (второй байт просто для иллюстрации, внимание на первый):
    11110001 10xxxxxx
    Если нуля бы не было, то это два байта, кодирующие символ Юникода 110001xxxxxx? Или это три байта, кодирующие символ 1001xxxxxx...? Или четыре, символ 001xxxxxx...?
    Не получится понять, не считав до начала следующего символа.
    Ответ написан
    Комментировать
  • Ошибка TypeError: 'int' object is not callable, в чем проблема?

    @galaxy
    n=int(fn*2(i+1)+fn*COS*(i+1)-sn)

    имелось в виду fn*2*(i+1)?
    Ответ написан
    1 комментарий