Существует ли задача граблей для резервного копирования данных в Вашей базе данных?

Надеемся, что это поможет кому-то новому в программировании и python:

Функция map() должна применять ту же процедуру для каждого item в iterable data structure, например lists, generators, strings и другие материалы.

Давайте посмотрим на пример: map() может iterate по каждому item в list и применить function к каждому item, чем return (вернет вас) new list.

Подумайте, что у вас есть function, который принимает число (integer), добавляет 1 к этому номеру и возвращает его.

def add_one(num):
  new_num = num + 1
  return new_num

У вас также есть list номеров (integers)

my_list = [1,3,6,7,8,10]

, если вы хотите increment присвоить каждому номеру (integer) в list, вы можете сделать следующее:

map(add_one, my_list)

Примечание: минимально map() требуется два arguments. Сначала имя function и второе что-то вроде результата list.

вышеприведенного примера, map() вернет вам это:

[2, 4, 7, 8, 9, 11]

Позволяет увидеть некоторые другие прохладный вещи map() можно сделать. map() может принимать несколько iterables (lists, strings, etc) и передавать element из каждого list (я использую список в качестве примера) в function как argument.

У нас есть следующие списки:

list_one = [1, 2, 3, 4, 5]
list_two = [11, 12, 13, 14, 15]
list_three = [21, 22, 23, 24, 25]

map() может сделать вас new list, который содержит добавление элементов в конкретном index (положение).

Теперь запомните map(), ему понадобится function.

def add_from_three_lists(num1, num2, num3):
    total_num = num1 + num2 + num3
    return total_num

теперь позволяет использовать функцию map()

map(add_from_three_lists, list_one, List_two, list_three)

, и вы получите:

[33, 36, 39, 42, 45]
]

ПОМНИТЕ: В Python2 map() будет iterate (пройдите через элементы lists) в соответствии с самым длинным list и передайте NoneType функции для более короткого lists, поэтому ваш function должен искать NoneType и обрабатывать их, иначе вы получите errors. В python 3 map() будет идти только по кратчайшему list. Кроме того, в Python 3, map() возвращает итератор, а не список.

5
задан Orion Edwards 27 August 2008 в 01:30
поделиться

6 ответов

Ниже сценария упрощенная версия, взятая от eycap, конкретно из этого файла.

set :dbuser "user"
set :dbhost "host"
set :database "db"

namespace :db do
  desc "Get the database password from user"
  task :get_password do
    set(:dbpass) do
      Capistrano::CLI.ui.ask "Enter mysql password: "
    end
  end

  task :backup_name, :only => { :primary => true } do
    now = Time.now
    run "mkdir -p #{shared_path}/db_backups"
    backup_time = [now.year,now.month,now.day,now.hour,now.min,now.sec].join('-')
    set :backup_file, "#{shared_path}/db_backups/#{database}-snapshot-#{backup_time}.sql"
  end

  desc "Dump database to backup file"
  task :dump, :roles => :db, :only => {:primary => true} do
    backup_name
    run "mysqldump --add-drop-table -u #{dbuser} -h #{dbhost} -p#{dbpass} #{database} | bzip2 -c > #{backup_file}.bz2"
  end
end

Править: Да, я предполагаю, что упустил суть, что Вы искали задачу граблей и не capistrano задачу, но у меня нет граблей один под рукой, извините.

5
ответ дан 14 December 2019 в 01:22
поделиться

У меня нет задачи граблей для резервного копирования моего дб MySQL, но я действительно писал сценарий в Ruby, чтобы сделать просто что для моего DB WordPress:

filename = 'wp-config.php'
def get_db_info(file)
  username = nil
  password = nil
  db_name = nil

  file.each { |line|
    if line =~ /'DB_(USER|PASSWORD|NAME)', '([[:alnum:]]*)'/
      if $1 == "USER"
        username = $2
      elsif $1 == "PASSWORD"
        password = $2
      elsif $1 == "NAME"
        db_name = $2
      end
    end
  }

  if username.nil? || password.nil? || db_name.nil?
    puts "[backup_db][bad] couldn't get all needed info"
    exit
  end

  return username, password, db_name
end

begin
  config_file = open("#{filename}")
rescue Errno::ENOENT
  puts "[backup_db][bad] File '#{filename}' didn't exist"
  exit
else
  puts "[backup_db][good] File '#{filename}' existed"
end

username, password, db_name = get_db_info(config_file)
sql_dump_info = `mysqldump --user=#{username} --password=#{password} #{dbname}`
puts sql_dump_info

Необходимо смочь взять это и сделать некоторое умеренное сокращение его, чтобы вставить username/password/dbname для подъема его и работающий на Вас. Я поместил его в свой crontab для выполнения каждый день также, и это не должно быть слишком много работы для преобразования этого для выполнения как задача граблей, так как это уже - код Ruby (могло бы быть хорошее осуществление изучения также).

Скажите нам, как это идет!

1
ответ дан 14 December 2019 в 01:22
поделиться

Существует a немногие решения уже на Google. Я собираюсь предположить, что Вы используете activerecord в качестве своего orm?

Если Вы выполняете направляющие, то Вы можете взгляды на Rakefile, который это использует для activerecord в \ruby\lib\ruby\gems\1.8\gems\rails-2.0.2-\lib\tasks\database.rake. Это дало мне большую информацию о том, как расширить универсальный Rakefile.

Вы могли взять capistrano задачи, которые обеспечивает thelsdj, и добавьте его к своему файлу граблей. Затем измените его немного так, чтобы это использовало activerecord соединение с базой данных.

1
ответ дан 14 December 2019 в 01:22
поделиться

Существует плагин, там названный "mysql задачи", просто Google для него. Это - просто rakefile - я нашел это очень простым в использовании.

1
ответ дан 14 December 2019 в 01:22
поделиться

Удостоверьтесь, что добавили "-стандартные программы" параметр к mysqldump, если Вы имеете, любой сохранил procs в Вашей базе данных, таким образом, это создает резервную копию их также.

0
ответ дан 14 December 2019 в 01:22
поделиться

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

Он предоставляет rake db : fixtures: dump задач. Это выводит все, что есть в YAML, в test / fixtures, поэтому его можно снова загрузить с помощью db: fixtures: load .

Мы используем это для резервного копирования перед каждым запуском функции. Мы также использовали это при переходе с sqlite3 на Postgres - эта тонкость очень полезна, поскольку несовместимость между диалектами SQL по большей части скрыта.

Всего наилучшего, D

1
ответ дан 14 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

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