2010-03-09 5 views
13

Кто-нибудь знает, как загрузить исходные данные для auth.User, используя sql-приборы? Для моих моделей у меня только есть < modelname> .sql файл в папке с именем sql, что syncdb делает работу красиво. Но я не знаю, как это сделать для модели auth.User. Я искал его, но безуспешно.Как загрузить sql fixture в Django для модели пользователя?

Спасибо заранее,

Aldo

ответ

4

Спасибо за ваши ответы. Я нашел решение, которое работает для меня, и для совпадения было одним из предложений Брайана. Вот оно:

Елки Я отключил сигнал, который создал пользователь Супер после 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>/управление/__ 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.

Я знаю, что это решение далека от совершенства, и критики/улучшения/мнения очень приветствуются!

С уважением,

Aldo

8

Вы ищете loaddata:

manage.py loadata path/to/your/fixtureFile 

Но я думаю, что команда может иметь дело только с файлами в XML, YAML, Python или в формате JSON (see here). Чтобы создать такие подходящие файлы, посмотрите на метод dumpdata.

+0

Я знаю, но есть ли способ автоматизировать это, точно так же, как обычные светильники вызывают в syncdb? – aldux

+0

@aldux: Afaik not –

3

Опция заключается в том, чтобы импортировать ваш auth.User SQL вручную и впоследствии выгружать его в стандартное устройство Django (назовите его initial_data, если вы хотите, чтобы syncdb его нашел). Обычно вы можете помещать этот файл в любой каталог приложений, так как все записанные данные будут снабжены соответствующей меткой app_label. Или вы можете создать пустое/фиктивное приложение и поместить его туда.

Другой вариант - переопределить команду syncdb и применить прибор так, как вы считаете нужным.

Я согласен с Феликс, что нет никакого нетривиального естественного крючка в Django для заполнения вкладов приложений с SQL.

24

Для SQL светильников, вы должны определенно иметь вставки заявления для 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>" 

вы можете создать хэш пароля быстро в Джанго оболочки

>>> from django.contrib.auth.models import User 
>>> u = User() 
>>> u.set_password('newpass') 
>>> u.password 
'sha1$e2fd5$96edae9adc8870fd87a65c051e7fdace6226b5a8' 

Это будет загружаться при каждом запуске syncdb.

3

Существует трюк для этого: (проверено на Django 1.3.1)

Решение:

  1. $) питон manage.py StartApp auth_fix
  2. $) mkdir auth_fix/fixtures
  3. $) python manage.py dumpdata auth> auth_fixtures/fixtures/initial_data.json
  4. Включите auth_fix в INSTALLED_APPS внутри settings.py.

В следующий раз, когда вы запустите «python manage.py syncdb», Django автоматически загрузит auth fixture.

Объяснение:

  1. Просто сделать пустое приложение, чтобы держать папку сантехникой. Оставьте _ init _py, models.py и views.py в нем, чтобы Django распознал его как приложение, а не только папку.
  2. Сделайте папку светильников в приложении.
  3. «python manage.py dumpdata auth» будет выгружать данные «auth» в БД со всей информацией о группах и пользователях. Остальная команда просто перенаправляет вывод в файл с именем «initial_data.json», который является тем, что ищет Django при запуске «syncdb».
  4. Просто введите auth_fix в INSTALLED_APPS внутри settings.py.

В этом примере показано, как это сделать в JSON, но вы можете в основном использовать выбранный вами формат.

+0

Мне нравится это исправление. Кстати, если у вас есть юг, см. [здесь] (http://south.readthedocs.org/ru/latest/fixtures.html#fixtures-from-migrations), чтобы позволить устройству загружаться только один раз. –

3

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

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

$ 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> 
1

Я просто добавил операторы SQL в пользовательский sql-файл для другой модели. Я выбрал модель Employee, потому что она зависит от auth_user. Пользовательский SQL, который я написал, действительно читает из моего устаревшего приложения и извлекает из него информацию о пользователе и использует REPLACE, а не INSERT (я использую MySQL), поэтому я могу запускать его, когда захочу. И я положил инструкцию REPLACE ... SELECT в процедуру, чтобы ее можно было запускать вручную или по расписанию с помощью cron.

 Смежные вопросы

  • Нет связанных вопросов^_^