Начиная с версии 3.7.0 и выше , pymongo устарела . Вместо этого используйте Collection.count_documents
. Запуск cursor.count
или collection.count
приведет к появлению следующего предупреждающего сообщения:
DeprecationWarning: count is deprecated. Use Collection.count_documents instead.
Для использования count_documents
код можно настроить следующим образом
import pymongo
db = pymongo.MongoClient()
col = db[DATABASE][COLLECTION]
filter = {"test_set":"abc"}
sort = [("abc",pymongo.DESCENDING)]
skip = 10
limit = 10
doc_count = col.count_documents(filter, skip=skip)
results = col.find(filter).sort(sort).skip(skip).limit(limit)
for doc in result:
//Process Document
Примечание: Метод count_documents
работает относительно медленно по сравнению с методом count
. Для оптимизации вы можете использовать collection.estimated_document_count
. Этот метод возвращает приблизительное количество документов (как следует из названия) на основе метаданных коллекции.
Заполнение данных с помощью фикстур - крайне плохая идея.
Приспособления не проходят валидацию, и поскольку большинство разработчиков Rails не используют ограничения базы данных, это означает, что вы можете легко получить недопустимые или неполные данные, вставленные в вашу производственную базу данных.
Приспособления также устанавливают странные идентификаторы первичных ключей по умолчанию, что не так. обязательно проблема, но работать с ней утомительно.
Есть много решений для этого. Мой личный фаворит - задача rake, которая запускает сценарий Ruby, который просто использует ActiveRecord для вставки записей. Это то, что Rails 3 будет делать с db: seed
, но вы можете легко написать это сами.
Я дополняю это методом, добавленным к ActiveRecord :: База называется create_or_update
. Используя это, я могу запускать исходный сценарий несколько раз, обновляя старые записи вместо того, чтобы генерировать исключение.
Я написал статью об этих методах некоторое время назад под названием Загрузка исходных данных .
For the first part of your question, yes I'd just put some precaution for running a task like this in production. I put a protection like this in my bootstrapping/seeding task:
task :exit_or_continue_in_production? do
if Rails.env.production?
puts "!!!WARNING!!! This task will DESTROY " +
"your production database and RESET all " +
"application settings"
puts "Continue? y/n"
continue = STDIN.gets.chomp
unless continue == 'y'
puts "Exiting..."
exit!
end
end
end
I have created this gist for some context.
For the second part of the question -- usually you really want two things: a) very easily seeding the database and setting up the application for development, and b) bootstrapping the application on production server (like: inserting admin user, creating folders application depends on, etc).
I'd use fixtures for seeding in development -- everyone from the team then sees the same data in the app and what's in app is consistent with what's in tests. (Usually I wrap rake app:bootstrap
, rake app:seed
rake gems:install
, etc into rake app:install
so everyone can work on the app by just cloning the repo and running this one task.)
I'd however never use fixtures for seeding/bootstrapping on production server. Rails' db/seed.rb
is really fine for this task, but you can of course put the same logic in your own rake app:seed
task, like others pointed out.
Как насчет того, чтобы просто удалить задачу с рабочего сервера после заполнения базы данных?
Rails 3 решит эту проблему за вас с помощью файла seed.rb.
http://github.com/ brynary / rails / commit / 4932f7b38f72104819022abca0c952ba6f9888cb
У меня только что появилась интересная идея ...
что, если бы вы создали \ db \ seed \ и добавили файлы стиля миграции:
file: 200907301234_add_us_states.rb
class AddUsStates < ActiveRecord::Seeds
def up
add_to(:states, [
{:name => 'Wisconsin', :abbreviation => 'WI', :flower => 'someflower'},
{:name => 'Louisiana', :abbreviation => 'LA', :flower => 'cypress tree'}
]
end
end
def down
remove_from(:states).based_on(:name).with_values('Wisconsin', 'Louisiana', ...)
end
end
поочередно :
def up
State.create!( :name => ... )
end
Это позволит вам запускать миграции и семена в таком порядке, который позволит им более мирно сосуществовать.
мысли?