MySQL Conditional Insert

Есть модуль gzip . Использование:

Пример того, как создать сжатый файл GZIP:

import gzip
content = b"Lots of content here"
f = gzip.open('/home/joe/file.txt.gz', 'wb')
f.write(content)
f.close()

Пример того, как GZIP сжать существующий файл:

import gzip
f_in = open('/home/joe/file.txt')
f_out = gzip.open('/home/joe/file.txt.gz', 'wb')
f_out.writelines(f_in)
f_out.close()
f_in.close()

РЕДАКТИРОВАТЬ :

Ответ Джейса Браунинга с использованием with в Python> = 2.7, очевидно, более краткий и читаемый, поэтому мой второй фрагмент будет (и должен) выглядеть так:

import gzip
with open('/home/joe/file.txt', 'rb') as f_in, gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:
    f_out.writelines(f_in)

94
задан The Unknown 27 May 2009 в 03:48
поделиться

5 ответов

Если ваша СУБД не накладывает ограничений на то, из какой таблицы вы выбираете при выполнении вставки, попробуйте:

INSERT INTO x_table(instance, user, item) 
    SELECT 919191, 123, 456
        FROM dual
        WHERE NOT EXISTS (SELECT * FROM x_table
                             WHERE user = 123 
                               AND item = 456)

В данном случае dual - это таблица с одной строкой только (изначально найден в Oracle, теперь и в mysql). Логика состоит в том, что оператор SELECT генерирует одну строку данных с необходимыми значениями, но только тогда, когда значения еще не найдены.

В качестве альтернативы, посмотрите на оператор MERGE.

111
ответ дан 24 November 2019 в 06:04
поделиться

Хотя перед вставкой данных хорошо проверять дублирование, я предлагаю вам установить уникальное ограничение / индекс для ваших столбцов, чтобы по ошибке нельзя было вставить повторяющиеся данные.

1
ответ дан 24 November 2019 в 06:04
поделиться
Insert into x_table (instance, user, item) values (919191, 123, 456) 
    where ((select count(*) from x_table where user=123 and item=456) = 0);

Синтаксис может отличаться в зависимости от вашей БД ...

-1
ответ дан 24 November 2019 в 06:04
поделиться

Если вы добавите ограничение, которое (x_table.user, x_table.item) является уникальным, то вставка другой строки с тем же пользователем и элементом не удастся.

например:

mysql> create table x_table ( instance integer primary key auto_increment, user integer, item integer, unique (user, item));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into x_table (user, item) values (1,2),(3,4);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into x_table (user, item) values (1,6);
Query OK, 1 row affected (0.00 sec)

mysql> insert into x_table (user, item) values (1,2);
ERROR 1062 (23000): Duplicate entry '1-2' for key 2
1
ответ дан 24 November 2019 в 06:04
поделиться

С UNIQUE (пользователь, элемент) , выполните:

Insert into x_table (instance, user, item) values (919191, 123, 456) 
  ON DUPLICATE KEY UPDATE user=123

бит user = 123 - это "не-операция" для сопоставления синтаксис предложения ON DUPLICATE без каких-либо действий при наличии дубликатов.

10
ответ дан 24 November 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: