Используя слой базы данных Django за пределами Django?

Одна из причин отказа от поведения неопределенной - позволить компилятору делать любые предположения, которые он хочет при оптимизации.

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

Итак, предположим, что ваш код содержит на самом деле надуманный пример, подобный приведенному ниже:

int bar = 0;
int foo = (undefined behavior of some kind);
if (foo) {
   f();
   bar = 1;
}
if (!foo) {
   g();
   bar = 1;
}
assert(1 == bar);

Компилятор может предположить, что! Foo является истинным в первом блоке, а foo - true во втором и, таким образом, оптимизирует весь фрагмент кода. Теперь логически либо foo, либо! Foo должно быть истинным, и поэтому, глядя на код, вы разумно сможете предположить, что бар должен равняться 1 после запуска кода. Но поскольку компилятор оптимизирован таким образом, бару никогда не присваивается значение 1. И теперь это утверждение становится ложным, и программа завершается, что является поведением, которое не произошло бы, если бы foo не полагался на неопределенное поведение.

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

67
задан gct 1 February 2010 в 22:05
поделиться

6 ответов

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

from django.conf import settings
settings.configure(
    DATABASE_ENGINE = 'postgresql_psycopg2',
    DATABASE_NAME = 'db_name',
    DATABASE_USER = 'db_user',
    DATABASE_PASSWORD = 'db_pass',
    DATABASE_HOST = 'localhost',
    DATABASE_PORT = '5432',
    TIME_ZONE = 'America/New_York',
)

Опять же, обязательно запустите этот код перед запуском, например: [

from your_app.models import *

] Затем просто используйте DB API как обычно.

65
ответ дан 24 November 2019 в 14:39
поделиться

Для django 1.5 on (поддерживается несколько баз данных) настройки базы данных также изменились. Вам нужно адаптировать предыдущий ответ к ...

settings.configure(
    DATABASES = { 'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db_name',
        'USER': 'db_usr',
        'PASSWORD': 'db_pass',
        'HOST': '',
        'PORT': '',
        }, },
    TIME_ZONE = 'Europe/Luxembourg'
)
3
ответ дан G. Schutz 7 November 2019 в 10:44
поделиться

Основываясь на ответе Хай Ху , приведу рабочий скрипт, протестированный на Django 1.10 и 1.11. Сначала я импортирую базовые приложения Django, потому что они нужны во многих других приложениях.

import os
from django.conf import settings
from django.apps import apps

conf = {
    'INSTALLED_APPS': [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.messages',
        'django.contrib.sessions',
        'django.contrib.sitemaps',
        'django.contrib.sites',
        'django.contrib.staticfiles',
        '<your_app>',
    ],
    'DATABASES': {
        'default': {
            'ENGINE': os.environ.get('DB_ENGINE'),
            'NAME': os.environ.get('DB_NAME'),
            'USER': os.environ.get('DB_USER'),
            'PASSWORD': os.environ.get('DB_PASSWORD'),
            'HOST': os.environ.get('DB_HOST'),
            'PORT': os.environ.get('DB_PORT'),
        }
    },
    'TIME_ZONE': 'UTC'
}

settings.configure(**conf)
apps.populate(settings.INSTALLED_APPS)

<import your app models here>
1
ответ дан Rani 7 November 2019 в 10:44
поделиться

Последний вариант, о котором никто не упоминал: пользовательская ./manage.py субкоманда .

9
ответ дан 24 November 2019 в 14:39
поделиться

Для использования Django ORM из других приложений вам нужно:

1) Экспорт Django_Settings_Module = DPROJ.Settings

2) Добавьте папку приложения Django на путь (вы можете сделать это в коде вашего Non-Django-App):

sys.path = sys.path + ['/path/to/your/app/']

3) Если использование SQLite, используйте полный путь к файлу БД в настройках .py:

DATABASE_NAME = '/path/to/your/app/base.db'
-121--921155-

Обновление Setup_environ - быть Удалены в Django 1.6

, если вы можете импортировать файл настроек .py, то посмотрите в удобной команде setup_environ.

from django.core.management import setup_environ
from mysite import settings

setup_environ(settings)

#here you can do everything you could in your project
12
ответ дан 24 November 2019 в 14:39
поделиться

Для использования Django ORM из других приложений вам нужно:

1) export DJANGO_SETTINGS_MODULE=dproj.settings

2) Добавить папку вашего приложения Django в путь (вы можете сделать это в коде вашего не-django-приложения):

sys.path = sys.path + ['/path/to/your/app/']

3) Если используется SQLite, используйте полный путь к файлу db в settings. py:

DATABASE_NAME = '/path/to/your/app/base.db'
2
ответ дан 24 November 2019 в 14:39
поделиться
Другие вопросы по тегам:

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