Как загрузить sql fixture в Django для модели User?
Кто-нибудь знает, как загружать исходные данные для auth.User, используя sql-приборы?
Для моих моделей я просто получил <modelname> .sql в папке с именем sql, что syncdb делает работу красиво. Но я не знаю, как это сделать для модели auth.User. Я искал его, но без успеха.
Спасибо заранее,
Альдо
Ответы
Ответ 1
Спасибо за ваши ответы. Я нашел решение, которое работает для меня, и для совпадения было одно из предложений Брайана. Вот он:
Firs Я отключил сигнал, который создал Суперпользователя после syncdb, поскольку у меня есть мой суперпользователь в моем устройстве auth_user:
models.py
from django.db.models import signals
from django.contrib.auth.management import create_superuser
from django.contrib.auth import models as auth_app
signals.post_syncdb.disconnect(
create_superuser,
sender=auth_app,
dispatch_uid = "django.contrib.auth.management.create_superuser")
Затем я создал сигнал, который вызывается после syncdb:
<myproject> /<myapp> /management/__ init __. py
"""
Loads fixtures for files in sql/<modelname>.sql
"""
from django.db.models import get_models, signals
from django.conf import settings
import <myproject>.<myapp>.models as auth_app
def load_fixtures(app, **kwargs):
import MySQLdb
db=MySQLdb.connect(host=settings.DATABASE_HOST or "localhost", \
user=settings.DATABASE_USER,
passwd=settings.DATABASE_PASSWORD, port=int(settings.DATABASE_PORT or 3306))
cursor = db.cursor()
try:
print "Loading fixtures to %s from file %s." % (settings.DATABASE_NAME, \
settings.FIXTURES_FILE)
f = open(settings.FIXTURES_FILE, 'r')
cursor.execute("use %s;" % settings.DATABASE_NAME)
for line in f:
if line.startswith("INSERT"):
try:
cursor.execute(line)
except Exception, strerror:
print "Error on loading fixture:"
print "-- ", strerror
print "-- ", line
print "Fixtures loaded"
except AttributeError:
print "FIXTURES_FILE not found in settings. Please set the FIXTURES_FILE in \
your settings.py"
cursor.close()
db.commit()
db.close()
signals.post_syncdb.connect(load_fixtures, sender=auth_app, \
dispatch_uid = "<myproject>.<myapp>.management.load_fixtures")
И в моем settings.py я добавил FIXTURES_FILE с пути к моему .sql файлу с дампом sql.
Одна вещь, которую я до сих пор не нашел, - это как запустить этот сигнал только после создания таблиц, а не при каждом запуске syncdb. Временная работа для этого - использование INSERT IGNORE INTO в моей команде sql.
Я знаю, что это решение далека от совершенства, и критики/улучшения/мнения очень приветствуются!
Привет,
Альдо
Ответ 2
Для инструментов SQL вы должны иметь специальные инструкции insert для таблиц auth
. Схему таблиц auth можно найти с помощью команды python manage.py sql auth
.
Намного проще и не зависит от базы данных (если у вас нет дополнительной магии SQL, которую вы хотите запустить), нужно просто создать JSON или YAML fixture в каталоге приборов вашего приложения с такими данными:
- model: auth.user
pk: 100000
fields:
first_name: Admin
last_name: User
username: admin
password: "<a hashed password>"
Вы можете быстро генерировать хэшированный пароль в оболочке django
>>> from django.contrib.auth.models import User
>>> u = User()
>>> u.set_password('newpass')
>>> u.password
'sha1$e2fd5$96edae9adc8870fd87a65c051e7fdace6226b5a8'
Это будет загружаться при каждом запуске syncdb
.
Ответ 3
Вы ищете loaddata
:
manage.py loadata path/to/your/fixtureFile
Но я думаю, что команда может обрабатывать только файлы в формате XML, YAML, Python или JSON (см. здесь). Чтобы создать такие подходящие файлы, просмотрите метод dumpdata
.
Ответ 4
Опция заключается в том, чтобы вручную импортировать ваш auth.User SQL вручную и впоследствии выгрузить его в стандартное устройство Django (назовите его initial_data, если вы хотите, чтобы syncdb его нашел). Обычно вы можете помещать этот файл в любой каталог app fixtures, так как все обновленные данные будут снабжены соответствующей меткой app_label. Или вы можете создать пустое/фиктивное приложение и поместить его там.
Другой вариант - переопределить команду syncdb и применить приспособление таким образом, как вы сочтете нужным.
Я согласен с Felix, что нет никакого нетривиального естественного крючка в Django для заполнения вкладов приложений с SQL.
Ответ 5
Для этого есть трюк: (проверено на Django 1.3.1)
Решение:
- $) python manage.py startapp auth_fix
- $) mkdir auth_fix/fixtures
- $) python manage.py dumpdata auth > auth_fixtures/fixtures/initial_data.json
- Включить auth_fix в INSTALLED_APPS внутри settings.py.
В следующий раз, когда вы запустите "python manage.py syncdb", Django автоматически загрузит auth-fixture.
Объяснение:
- Просто создайте пустое приложение, чтобы удерживать папку приборов. Оставьте _init_py, models.py и views.py в нем, чтобы Django распознал его как приложение, а не только папку.
- Сделайте папку приборов в приложении.
- "python manage.py dumpdata auth" будет выгружать данные "auth" в БД со всеми данными групп и пользователей. Остальная команда просто перенаправляет вывод в файл с именем "initial_data.json", который является тем, что ищет Django при запуске "syncdb".
- Просто включите auth_fix в INSTALLED_APPS внутри settings.py.
В этом примере показано, как это сделать в JSON, но вы можете в основном использовать формат по вашему выбору.
Ответ 6
Если вы выполняете миграцию базы данных с юга, создание пользователей очень просто.
Во-первых, создайте мизерную миграцию данных. Он должен быть включен в какое-либо приложение. Если у вас есть общее приложение, в котором вы размещаете общий код, это будет хороший выбор. Если у вас есть приложение, в котором вы сконцентрируете пользовательский код, это будет еще лучше.
$ python manage.py datamigration <some app name> add_users
Соответствующий код миграции может выглядеть примерно так:
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import DataMigration
from django.db import models
from django.contrib.auth.models import User
class Migration(DataMigration):
users = [
{
'username': 'nancy',
'email': '[email protected]',
'password': 'nancypassword',
'staff': True,
'superuser': True
},
{
'username': 'joe',
'email': '',
'password': 'joepassword',
'staff': True,
'superuser': False
},
{
'username': 'susan',
'email': '[email protected]',
'password': 'susanpassword',
'staff': False,
'superuser': False
}
]
def forwards(self, orm):
"""
Insert User objects
"""
for i in Migration.users:
u = User.objects.create_user(i['username'], i['email'], i['password'])
u.is_staff = i['staff']
u.is_superuser = i['superuser']
u.save()
def backwards(self, orm):
"""
Delete only these users
"""
for i in Migration.users:
User.objects.filter(username=i['username']).delete()
Затем просто запустите миграцию, и пользовательские файлы должны быть вставлены.
$ python manage.py migrate <some app name>
Ответ 7
Я просто добавил инструкции SQL в пользовательский sql файл для другой модели. Я выбрал модель Employee, потому что она зависит от auth_user.
Пользовательский SQL, который я написал, действительно читает из моего устаревшего приложения и извлекает из него информацию о пользователе и использует REPLACE, а не INSERT (я использую MySQL), поэтому я могу запускать его, когда захочу.
И я положил этот оператор REPLACE... SELECT в процедуру, чтобы он легко запускался вручную или по расписанию с помощью cron.