Nano Hash - криптовалюты, майнинг, программирование

Django: динамический файл базы данных

В моем проекте Django у меня есть зависимость от стороннего приложения, которое создает файлы кеша SQLite в различных каталогах с известной схемой.

Я хотел бы использовать модели Django для доступа к этим базам данных, но, очевидно, я не могу использовать статическую настройку DATABASES.

Как я могу динамически открыть базу данных SQLite по произвольному пути?

ИЗМЕНИТЬ

Как указал Байрон Рут, решение состоит в том, чтобы использовать django.db.connections в сочетании с using в QuerySet.


  • почему нельзя использовать БАЗЫ ДАННЫХ? Из того, что я вижу, это то, почему авторы Django сделали это! Другой вариант — использовать необработанный sql (docs.python.org/2/library/sqlite3). .html), но это как бы противоречит цели фреймворка! 10.01.2013
  • @StefanNch: я не могу использовать настройку DATABASES, потому что не знаю, какие базы данных у меня будут, потому что они добавляются динамически. И да, сейчас я использую sqlite3 API, которым не полностью доволен, так как не хочу копаться в SQL. 10.01.2013
  • это интересная архитектура, но теперь я вижу вашу проблему... 10.01.2013

Ответы:


1

django.db.connections — это простая оболочка вокруг DATABASES, определенная в ваших настройках. Класс-оболочка находится здесь: django.db.utils#L137-L227< /а>

from django.db import connections

# Add connection information dynamically..
connections.databases['new-alias'] = { ... }
# Ensure the remaining default connection information is defined.
# EDIT: this is actually performed for you in the wrapper class __getitem__
# method.. although it may be good to do it when being initially setup to
# prevent runtime errors later.
# connections.databases.ensure_defaults('new-alias')

# Use the new connection
conn = connections['new-alias']
21.01.2013
  • Я думаю, что это решение, которое я искал. Я попробую! 22.01.2013
  • Вот и все, я смог динамически выбрать файл базы данных, открыть его и использовать свои модели. (однако для этого требуется функция using в наборе запросов). 22.01.2013
  • Ницца! хм... так это соединение нужно добавлять для каждого входящего запроса, который должен использовать БД? Было бы неплохо обернуть это в какое-то промежуточное программное обеспечение, чтобы настроить БД по мере поступления запроса... 14.11.2013
  • @monkut они будут храниться на протяжении всего процесса. быстрая if 'new-alias' not in connections.databases проверка гарантирует, что настройки всегда присутствуют. Кстати, если вам действительно нужно временное подключение к базе данных, попробуйте следующее: gist .github.com/bruth/7467130 14.11.2013
  • Этот метод также не разрешает `model_instance.save(using='new-alias'). Можно ли как-то добавить эту функцию? 20.11.2013

  • 2

    Вы можете зарегистрировать базу данных в настройках DATABASES.

    from your_project import settings
    database_id = "unqique_name"
    new_database = {}
    new_database["id"] = database_id
    new_database['ENGINE'] = 'django.db.backends.sqlite3'
    new_database['NAME'] = '/project/data/db_%s.sql' % database_id
    new_database['USER'] = ''
    new_database['PASSWORD'] = ''
    new_database['HOST'] = ''
    new_database['PORT'] = ''
    settings.DATABASES[database_id] = new_database
    

    Вы можете, но не должны.

    10.01.2013
  • Это выглядит интересно, я попробую. Но я бы предпочел решение, в котором мне не нужно изменять настройку DATABASES. 10.01.2013
  • Вы не должны изменять настройки в своих приложениях во время выполнения. Например, не делайте этого в представлении: docs.djangoproject.com/en/dev/topics/settings/ 10.01.2013

  • 3

    Предполагая, что единственным используемым движком является SQLite, а местоположение (единственного) файла базы данных меняется, укажите вызываемый объект для NAME:

    def get_db_loc():
        # code to determine filesystem location of database
        return location
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': get_db_loc(),
            # More config goes here
        }
    }
    
    20.01.2013
  • Я бы поддержал это. Если местоположения БД динамически меняются во время выполнения, убедитесь, что get_db_loc() меняет свое поведение в зависимости от того, какая БД активна в данный момент (сохраните эту информацию в текстовом файле/глобальной переменной), а затем внутри get_db_loc() в режиме реального времени перенаправьте на текущая активная БД. 22.01.2013
  • Я не уверен, что это сработает, потому что функция get_db_loc оценивается только один раз, а не каждый раз при чтении DATABASES. Но в остальном спасибо за вклад. 22.01.2013
  • Правильно, это никак не может сработать. Результатом get_db_loc() является просто строка. Нет ничего особенного в том, что оно было получено путем вызова функции, и нет ничего, что говорило бы о том, что эту функцию нужно вызывать снова. 11.11.2014
  • Ах, достаточно справедливо. Может ли сработать переход от вызова функции к обратному вызову? get_db_loc() становится get_db_loc пожимает плечами 13.11.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..