Устранение миграций и изменений схемы при работе с ветвями git [duplicate]

Функции стрелок не привязывают this. В соответствии с MDN:

Отсутствие привязки этого

До тех пор, пока функции стрелок, каждая новая функция не определила свое собственное значение this (новый объект в случае конструктора, undefined в строгом режиме вызовы функций, объект контекста, если функция вызывается как «метод объекта» и т. д.). Это оказалось раздражающим объектно-ориентированным стилем программирования.

blockquote>

Таким образом, this в вашем примере будет глобальным объектом window, который, по-видимому, не имеет свойства, называемого x.

Пример:

function foo() {
  let arrow = () => {
    console.log(this);     // will use foo's this as arrow will never have its own this
  }
  
  arrow.call({"x": "x"});  // ... even if we specify it using bind, call, or apply
}

foo.call({"y": "y"});      // specifying the this for foo (this value will eventually be used by arrow because it will be availbale in its scope)

118
задан Kostas 21 May 2013 в 10:46
поделиться

11 ответов

Вы хотите сохранить «среду db» для каждой ветви. Посмотрите на smudge / clean script, чтобы указать на разные экземпляры. Если у вас закончились экземпляры db, попросите сценарий отключить временный экземпляр, поэтому, когда вы переключаетесь на новую ветку, она уже существует и просто должна быть переименована скриптом. Обновления БД должны запускаться непосредственно перед выполнением ваших тестов.

Надеемся, что это поможет.

2
ответ дан Adam Dymitruk 22 August 2018 в 19:53
поделиться
  • 1
    Это решение подходит только для "временных" ветви. Например, если у нас есть ветвь "edge" мы проверяли все виды сумасшедших вещей (возможно, с другими подразделениями), а затем время от времени сливаем их с мастером, 2 базы данных будут дрейфовать (их данные не будут одинаковыми). – Kostas 20 January 2011 в 18:46
  • 2
    Это решение подходит для полной противоположности. Это очень хорошее решение, если вы используете версию сценария версии вашей базы данных. – Adam Dymitruk 26 January 2011 в 22:09

Я бы предложил один из двух вариантов:

Вариант 1

  1. Поместите свои данные в seeds.rb. Хорошим вариантом является создание ваших данных семян с помощью FactoryGirl / Fabrication gem. Таким образом, вы можете гарантировать, что данные синхронизируются с кодом, если мы предположим, что фабрики обновляются вместе с добавлением / удалением столбцов.
  2. После переключения из одной ветки в другую запустите rake db:reset, который эффективно уменьшает / создает / семени базы данных.

Вариант 2

Вручную сохраняйте состояния базы данных, всегда запуская rake db:rollback / rake db:migrate до / после проверки филиала. Предостережение заключается в том, что все ваши миграции должны быть обратимыми, иначе это не сработает.

0
ответ дан Alex Popov 22 August 2018 в 19:53
поделиться

В среде разработки:

Вы должны работать с rake db:migrate:redo, чтобы проверить, является ли ваш скрипт обратимым, но имейте в виду, что всегда необходимо иметь seed.rb с совокупностью данных.

Если вы работаете с git, вы должны изменить change.rb с изменением миграции и выполнением db:migrate:redo для начала (загрузить данные для новой разработки на другой машине или новой базе данных)

Помимо «обмена», с вашими методами up и down ваш код всегда будет сценарием для «изменения» в этот момент и при запуске с нуля.

0
ответ дан Daniel Antonio Nuñez Carhuayo 22 August 2018 в 19:53
поделиться

Я боролся с той же проблемой. Вот мое решение:

  1. Убедитесь, что все schema.rb и все миграции отмечены всеми разработчиками.
  2. Должен быть один человек / машина для развертывания в производстве , Назовем эту машину как машину слияния. Когда изменения вытягиваются на машину слияния, автоматическое слияние для schema.rb не будет выполнено. Без вопросов. Просто замените содержимое каким бы то ни было предыдущим содержимым для schema.rb (вы можете отложить копию или получить ее из github, если вы ее используете ...).
  3. Вот важный шаг. Миграции от всех разработчиков теперь будут доступны в папке db / migrate. Идем дальше и запускаем команду exec rake db: migrate. Это приведет к тому, что база данных на машине слияния сравняется со всеми изменениями. Он также будет регенерировать schema.rb.
  4. Зафиксировать и вывести изменения во все репозитории (пульты и индивидуумы, которые тоже являются пультами). Вы должны быть готовы!
3
ответ дан dmckee 22 August 2018 в 19:53
поделиться

Я полностью ощущаю лаваш, который у вас здесь. Поскольку я думаю об этом, реальная проблема заключается в том, что у всех ветвей нет кода для отката определенных ветвей. Я в мире джанго, поэтому я не знаю, как это хорошо. Я играю идею о том, что миграции живут в своем собственном репо, который не имеет разветвленной (git-подмодуль, о которой я недавно узнал). Таким образом, все ветви имеют все миграции. Липкая часть гарантирует, что каждая ветвь ограничена только теми миграциями, которые им нравятся. Выполнение / отслеживание этого вручную было бы лайтом и подвержено ошибкам. Но для этого не созданы никакие инструменты миграции. Это тот момент, в который я не продвигаюсь вперед.

2
ответ дан JohnO 22 August 2018 в 19:53
поделиться
  • 1
    Это хорошая идея, но что происходит, когда ветка переименовывает столбец? Остальные ветви будут смотреть на разбитый стол. – Kostas 21 February 2011 в 11:40
  • 2
    um - то есть липкая часть - какая ветка заботится о том, какие миграции. так что вы можете перейти & quot; sync & quot; и он знает, что «возвращает эту миграцию». поэтому столбец возвращается. – JohnO 21 February 2011 в 16:27

Вот сценарий, который я написал для переключения между ветвями, которые содержат разные миграции:

https://gist.github.com/4076864

It не решает все проблемы, о которых вы упомянули, но с указанием имени ветки:

  1. Откат любых миграций на вашей текущей ветви, которые не существуют на данной ветви
  2. Отменить любые изменения в файле db / schema.rb
  3. Проверить выделенную ветвь
  4. Запустить любые новые миграции, существующие в данной ветке
  5. Обновить тест database

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

13
ответ дан Jon Lemmon 22 August 2018 в 19:53
поделиться
  • 1
    Этот скрипт делает именно то, что я хочу сделать, я бы хотел, чтобы он был включен в автоматический крюк. – brysgo 4 April 2014 в 16:40
  • 2
    Это как раз, я разветвил ваш смысл и сделал его крюком после проверки: gist.github.com/brysgo/9980344 – brysgo 4 April 2014 в 19:30
  • 3
    В вашем сценарии вы действительно хотели сказать git checkout db/schema.rb, или вы имели в виду git checkout -- db/schema.rb? (т. е. с двойными штрихами) – user664833 25 August 2014 в 05:31
  • 4
    Ну да ... Я не знал о двойных тире в то время. Но команда будет работать одинаково, если у вас нет ветки с именем db/schema.rb. :) – Jon Lemmon 26 August 2014 в 07:25
  • 5
    @ brysgo's evolved git_rails command ( github.com/brysgo/git-rails ) отлично работает. Спасибо вам, Джон :) – Zia Ul Rehman Mughal 25 January 2017 в 06:11

Отдельная база данных для каждой ветви

Это единственный способ летать.

Update 16 октября 2017 г.

Я вернулся к этому через некоторое время и сделал некоторые улучшения:

  • Я добавил еще одну задачу рейка пространства имен, чтобы создать ветвь и клонировать базу данных одним махом, с bundle exec rake git:branch.
  • Теперь я понимаю что клонирование от мастера не всегда то, что вы хотите сделать, я сделал его более явным, что задача db:clone_from_branch принимает переменную среды SOURCE_BRANCH и TARGET_BRANCH. При использовании git:branch он автоматически использует текущую ветвь как SOURCE_BRANCH.
  • Рефакторинг и упрощение.

config/database.yml

И чтобы вам было проще, вот как вы обновляете свой файл database.yml для динамического определения имени базы данных на основе текущей ветви.

<% 
database_prefix = 'your_app_name'
environments    = %W( development test ) 
current_branch  = `git status | head -1`.to_s.gsub('On branch ','').chomp
%>

defaults: &defaults
  pool: 5
  adapter: mysql2
  encoding: utf8
  reconnect: false
  username: root
  password:
  host: localhost

<% environments.each do |environment| %>  

<%= environment %>:
  <<: *defaults
  database: <%= [ database_prefix, current_branch, environment ].join('_') %>
<% end %>

lib/tasks/db.rake

Вот задача Rake, чтобы легко клонировать вашу базу данных из одной ветки в другую. Это принимает переменные среды SOURCE_BRANCH и TARGET_BRANCH. Исход из задачи @spalladino .

namespace :db do

  desc "Clones database from another branch as specified by `SOURCE_BRANCH` and `TARGET_BRANCH` env params."
  task :clone_from_branch do

    abort "You need to provide a SOURCE_BRANCH to clone from as an environment variable." if ENV['SOURCE_BRANCH'].blank?
    abort "You need to provide a TARGET_BRANCH to clone to as an environment variable."   if ENV['TARGET_BRANCH'].blank?

    database_configuration = Rails.configuration.database_configuration[Rails.env]
    current_database_name = database_configuration["database"]

    source_db = current_database_name.sub(CURRENT_BRANCH, ENV['SOURCE_BRANCH'])
    target_db = current_database_name.sub(CURRENT_BRANCH, ENV['TARGET_BRANCH'])

    mysql_opts =  "-u #{database_configuration['username']} "
    mysql_opts << "--password=\"#{database_configuration['password']}\" " if database_configuration['password'].presence

    `mysqlshow #{mysql_opts} | grep "#{source_db}"`
    raise "Source database #{source_db} not found" if $?.to_i != 0

    `mysqlshow #{mysql_opts} | grep "#{target_db}"`
    raise "Target database #{target_db} already exists" if $?.to_i == 0

    puts "Creating empty database #{target_db}"
    `mysql #{mysql_opts} -e "CREATE DATABASE #{target_db}"`

    puts "Copying #{source_db} into #{target_db}"
    `mysqldump #{mysql_opts} #{source_db} | mysql #{mysql_opts} #{target_db}`

  end

end

lib/tasks/git.rake

Эта задача создаст ветку git для текущей ветви (master , или иначе), проверьте его и клонируйте базу данных текущего филиала в базу данных нового филиала.

namespace :git do

  desc "Create a branch off the current branch and clone the current branch's database."
  task :branch do 
    print 'New Branch Name: '
    new_branch_name = STDIN.gets.strip 

    CURRENT_BRANCH = `git status | head -1`.to_s.gsub('On branch ','').chomp

    say "Creating new branch and checking it out..."
    sh "git co -b #{new_branch_name}"

    say "Cloning database from #{CURRENT_BRANCH}..."

    ENV['SOURCE_BRANCH'] = CURRENT_BRANCH # Set source to be the current branch for clone_from_branch task.
    ENV['TARGET_BRANCH'] = new_branch_name
    Rake::Task['db:clone_from_branch'].invoke

    say "All done!"
  end

end

Теперь все, что вам нужно сделать, это запустить bundle exec git:branch, ввести новое имя ветки и начать убивать зомби.

4
ответ дан Joshua Pinter 22 August 2018 в 19:53
поделиться

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

  • Перед переключением ветвей, откат (rake db:rollback) до состояния до точки ветвления. Затем, после переключения ветвей, запустите db:migrate. Это математически корректно, и пока вы пишете скрипты down, он будет работать.
  • Если вы забудете сделать это перед переключением ветвей, в общем, вы можете безопасно переключить назад, откат и снова переключиться, так что я думаю, что это рабочий процесс, это возможно.
  • Если у вас есть зависимости между переходами в разных ветвях ... ну, вам придется много думать.
17
ответ дан ndp 22 August 2018 в 19:53
поделиться
  • 1
    Вы должны иметь в виду, что не все миграции являются обратимыми, так как первый предложенный шаг не гарантирует успеха. Я думаю, что в среде разработки хорошей идеей было бы использовать rake db:schema:load и rake db:seed, как сказал @noodl. – pisaruk 30 August 2012 в 04:58
  • 2
    – Luke Griffiths 30 September 2018 в 14:18
  • 3

Возможно, вы должны принять это как подсказку о том, что ваша база данных разработки слишком велика? Если вы можете использовать db / seeds.rb и меньший набор данных для разработки, то ваша проблема может быть легко решена с помощью schema.rb и seeds.rb из текущей ветви.

Предполагается, что ваш вопрос связан развитию; Я не могу себе представить, почему вам нужно регулярно переключаться на производство.

4
ответ дан noodl 22 August 2018 в 19:53
поделиться

Это то, что я сделал, и я не совсем уверен, что я рассмотрел все основы:

В разработке (с использованием postgresql):

  • sql_dump db_name > tmp / branch1.sql
  • git checkout branch2
  • dropdb db_name
  • createdb db_name
  • psql db_name & lt; tmp / branch2.sql # (из предыдущего коммутатора ветви)

Это намного быстрее, чем утилиты rake в базе данных с около 50 тыс. записей.

Для производства, поддерживайте основную ветвь как sacrosanct, и все миграции проверяются в, shema.rb правильно сливается. Пройдите стандартную процедуру обновления.

3
ответ дан Paul Carmody 22 August 2018 в 19:53
поделиться
  • 1
    При достаточно малых размерах базы данных и при выполнении этого в фоновом режиме при проверке ветки выглядит очень приятным решением. – Kostas 21 May 2013 в 10:42

Когда вы добавляете новую миграцию в любом филиале, запустите rake db:migrate и зафиксируйте как миграцию, так и db/schema.rb

. Если вы сделаете это, в процессе разработки вы сможете переключиться на другую ветвь, которая имеет другой набор миграций и просто запускает rake db:schema:load.

Обратите внимание, что это воссоздает всю базу данных, а существующие данные будут потеряны.

Возможно, вы только хотите запустить производство из одной ветки, с которой вы очень осторожны, поэтому эти шаги там не применяются (просто запустите rake db:migrate, как обычно там). Но в разработке не должно быть большого труда воссоздать базу данных из схемы, что будет rake db:schema:load.

58
ответ дан ptpaterson 22 August 2018 в 19:53
поделиться
  • 1
    Я думаю, что это только решит проблему схемы, данные будут потеряны при каждой нисходящей миграции, которую больше не будет видно. Было бы неплохо сохранить какой-то патч db-data-патч, который будет сохранен при перемещении из ветки и другой, загружаемой при переходе в другую ветку? Патчи должны содержать только данные, которые будут потеряны при движении вниз (миграции). – Kostas 20 January 2011 в 18:51
  • 2
    Если вы хотите загружать данные, используйте db/seeds.rb. Не должно быть слишком разрушительным, чтобы уничтожить вашу базу данных разработки, если вы установите там некоторые разумные семенные данные. – Andy Lindeman 21 January 2011 в 16:15
  • 3
    не нужно ничего наносить. см. мое решение ниже. Просто имейте в виду, что у вас будет много экземпляров, и когда вы переключаете ветви, данных нет. Это совершенно нормально, если вы разрабатываете тесты. – Adam Dymitruk 26 January 2011 в 22:11
  • 4
    Спасибо, Энди, этот ответ тоже мой вопрос. И соглашайтесь на использование db/seeds.rb для рипопуляции потерянных данных db – pastullo 20 January 2014 в 21:38
Другие вопросы по тегам:

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