Направляющие: Лучший способ внести изменения в производственную базу данных

Давайте выясним:

In [8]: def with_assignment(arr, x, y):
   ...:     a = arr[x][y]
   ...:     return a
   ...: 

In [9]: dis.dis(with_assignment)
  2           0 LOAD_FAST                0 (arr)
              3 LOAD_FAST                1 (x)
              6 BINARY_SUBSCR       
              7 LOAD_FAST                2 (y)
             10 BINARY_SUBSCR       
             11 STORE_FAST               3 (a)

  3          14 LOAD_FAST                3 (a)
             17 RETURN_VALUE        

In [10]: def without_assignment(arr, x, y):
   ....:     return arr[x][y]
   ....: 

In [11]: dis.dis(without_assignment)
  2           0 LOAD_FAST                0 (arr)
              3 LOAD_FAST                1 (x)
              6 BINARY_SUBSCR       
              7 LOAD_FAST                2 (y)
             10 BINARY_SUBSCR       
             11 RETURN_VALUE        

Итак, добавление присваивания добавляет две инструкции байт-кода, a STORE_FAST и LOAD_FAST. Таким образом, строго говоря, использование значения напрямую быстрее. Но на сколько?

In [34]: arr = [range(100) for _ in xrange(1000)]

In [35]: %timeit without_assignment(arr, random.randint(0,999), random.randint(0,99))
The slowest run took 9.75 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.83 µs per loop

In [36]: %timeit with_assignment(arr, random.randint(0,999), random.randint(0,99))
The slowest run took 10.57 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.8 µs per loop

Итак, для относительно небольших массивов кажется, что разница составляет несколько микросекунд. Если вы пытаетесь сделать свой код более эффективным, это, вероятно, не является узким местом.

Если вы собираетесь повторно использовать значение, очевидно, сохраните его, чтобы вам не приходилось пересчитывать его.

10
задан 2 revs 15 October 2008 в 21:42
поделиться

4 ответа

Это кажется, что Вы находитесь в состоянии, где производственная схема дб точно не соответствует тому, что Вы используете в dev (хотя это не полностью ясно). Я чертил бы линию в песке и получил бы тот дб напоминания в лучшем состоянии. По существу то, что Вы хотите сделать, удостоверяются, что дб напоминания имеет "schema_info" таблицу, которая перечисляет любые миграции, которые Вы> не делаете <когда-либо хотят работать в производстве. Затем можно добавить миграции к содержанию основ, и они будут работать против производственного дб.

После того как Вы сделали это, можно записать миграции, которые добавляют изменения схемы или добавляют данные, но одна вещь, относительно которой необходимо быть действительно осторожны, состоит в том, что, если Вы добавляете данные с помощью миграции, необходимо определить модель в рамках самой миграции, как это:

class AddSomeColumnsToUserTable < ActiveRecord::Migration
  class User < ActiveRecord::Base; end
  def self.up
    add_column :users, :super_cool, :boolean, :default => :false
    u = User.find_by_login('cameron')
    u.super_cool = true
    u.save
  end

  def self.down
    remove_column :users, :super_cool
  end
end

Причина этого состоит в том, что в будущем, Вы могли бы удалить модель в целом, во время некоторого рефакторинга или другого. Если Вы не определите пользовательский класс на строке "Пользователь find_by_login..." миграция, то выдаст исключение, которое является большой болью.

6
ответ дан 3 December 2019 в 16:11
поделиться

Я всегда выполняю эту процедуру:

  • База данных напоминания дампа с командой mysqldump
  • Заполните dev / тестовая база данных с дампом с помощью mysql команду
  • Выполненные миграции в dev / тест
  • Проверьте, что миграция работала
  • База данных напоминания дампа с командой mysqldump (поскольку это, возможно, изменилось), сохраняющий резервное копирование на сервере
  • Выполненные миграции на напоминании (использующий capristano)
  • Тестовая миграция работала над напоминанием
  • Пиво напитка (при наблюдении журналов ошибок)
14
ответ дан 3 December 2019 в 16:11
поделиться

Существует ли причина, Вы не используете те же миграции, которые Вы использовали в своей dev среде?

4
ответ дан 3 December 2019 в 16:11
поделиться

Добавление столбца с add_column в миграции должно быть неразрушающим: это генерирует оператор "ALTER TABLE". Если Вы знаете то, что Вы собираетесь поместить в столбцы, однажды созданные, можно заполнить значения в рамках миграции (можно выбрать менее трудоемкую альтернативу, если количества строки являются большими).

Удаление или изменение определения столбца, я думаю, зависимый платформы: некоторые позволят удаление столбца на месте, другие выполнят rename-create-select-drop последовательность команд.

Для получения более конкретными нам нужно больше информации: на какую миграцию Вы смотрите, на какой платформе Вы работаете, Вам нужно к установленным значениям как часть миграции? Материал как этот помог бы много - просто редактируют вопрос, который пододвинет его обратно список.

2
ответ дан 3 December 2019 в 16:11
поделиться
Другие вопросы по тегам:

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