Форум сайта python.su
neitro
1. Не увидел здесь алхимию хотя смотрел в оба глаза.
2. Почему-бы перед тем, как обновить не проверить: а изменилось ли вообще поле?
3. Ну и индескы. Хотя об этом уже сказали. И не раз.
4. Sqlite хорош для малого хранения данных. Для чего-то сложнее нужно выбирать между PostgreSQL и Mongo (зависит от структуры данных). Учитывая Ваши данные предпочтительнее PostgreSQL.
P.S. Насчет 10кк реально не заметил. Но учитывая, что мной обновляемая БД структурно сложнее в разы и там огромное количество сложных проверок, то все равно у Вас очень много. Когда-то делал так-же без проверки. Разница была на проверяемой БД 25 и 7 сек. Так что имеет смысл все же проверить поле на изменение.
Отредактировано 4kpt_III (Авг. 3, 2015 22:33:33)
Офлайн
А какие данные у вас в файле? Точно их нельзя вычислить и базу одним запросом проапдейтить?
Офлайн
neitroУжас какой! Тут не весь код, но если я правильно понимаю, вы собираете в текстовой переменной текст 1000 sql-запросов и кормите этим базу? Собирайте данные в списке кортежей, а потом запускайте c executemany и биндингом параметровsql += str_update_ip_domain(arr[0], arr[1], arr[2]) if i % 1000 == 0: try: # обработка исключения cur.executescript(sql) # Выполняем SQL-запрос sql = '' except sqlite.DatabaseError, err: print u"Ошибка:", err
Офлайн
RodegastНет, на тот момент не делал - сейчас этим вопросом озадачился
Индекс сделал?
4kpt_III
1. Не увидел здесь алхимию хотя смотрел в оба глаза.
2. Почему-бы перед тем, как обновить не проверить: а изменилось ли вообще поле?
3. Ну и индескы. Хотя об этом уже сказали. И не раз.
4. Sqlite хорош для малого хранения данных. Для чего-то сложнее нужно выбирать между PostgreSQL и Mongo (зависит от структуры данных). Учитывая Ваши данные предпочтительнее PostgreSQL.
try: # обработка исключения cur.executescript(sql) # Выполняем SQL-запрос sql = '' except sqlite.DatabaseError, err: print u"Ошибка:", err
try: # обработка исключения session.query(Info).filter_by(name="%s" % value).update({'text1': text1}) except: print u"Ошибка:"
PooHИменно так я и делаю, как это не было прискорбно (про 1к UPDATE).
Ужас какой! Тут не весь код, но если я правильно понимаю, вы собираете в текстовой переменной текст 1000 sql-запросов и кормите этим базу? Собирайте данные в списке кортежей, а потом запускайте c executemany и биндингом параметров
FishHook
А какие данные у вас в файле? Точно их нельзя вычислить и базу одним запросом проапдейтить?
Офлайн
neitro
Второе предложение не понял - пошел гуглить инфу что это и с чем едят
sql = '''UPDATE domains SET text1 = ?, date1 = ? WHERE name = ?; '''
data = [('text1', date1, 'name'), ('text1', date1, 'name'), ('text1', date1, 'name'), ... ]
cur.executemany(sql, data)
Офлайн
Вообще странная программа, которая сначала накапливает данные в текстовом файле, а потом этими данными апдейтит БД. Сразу нельзя что ли?
Офлайн
neitroВопрос был конкретно такой
Я не знаю как можно 1-м запросом это сделать.
Точно их нельзя вычислить?поясню, если например у меня есть таблица в БД
Офлайн
Если вам не нужна собственно сама программа, а нужен результат (если это не учебный проект, а реальная производственная необходимость), то я бы попробовал так:
1. Загружаем данные из файла в БД. Насколько я понимаю, у вас CSV файл. SQLite умеет засасывать данные из CSV.
2. собственно апдейтим используя синтаксис
UPDATE table SET columns = (SELECT .....) WHERE ....
Офлайн
FishHook
Вообще странная программа, которая сначала накапливает данные в текстовом файле, а потом этими данными апдейтит БД. Сразу нельзя что ли?
Офлайн
neitro
она была до sqlite3
neitro
PS Для того что бы понять необходимость обновления нужно получить эти данные. И тут тоже стоит вопрос, как это сделать. Адскую конструкцию типа
Select (name,text1,date1) from table where name = ‘value1’ or name = ‘value2’ or … name = ‘value10000’
Но это кажется совсем не красивой конструкцией.
Офлайн