Почему я получаю сообщение "No Such Table" при выполнении SQL-запроса с помощью cursor.execute()?

Я пытаюсь выполнить простой sql запрос, но постоянно получаю "Operational Error: No Such Table customers" Код, о котором идет речь, следующий:

cursor = connection.cursor()
cursor.execute("SELECT * FROM customers")
# cursor.festchone() or cursor.fetchall()
r = cursor.fetchone()
print(r)

Что странно, так это то, что выполнение необработанного SQL-запроса с использованием приведенного ниже кода работает, и я могу перебирать строки и отображать их в HTML:

sql = "SELECT * FROM customers"
customer = Customer.objects.raw(sql)[:10]
print(customer)
print(connection.queries)

Когда я пробую SQL, объясненный в debug_toolbar для 2-го кода выше, который работал, я получаю, что выглядит правильно:

Executed SQL
SELECT *
  FROM customers
Time
1.1129379272460938 ms
Database
network_db

Кроме того, что странно, в документации django говорится о необходимости добавления имени приложения, поэтому при добавлении имени app_name network во второй код, я получаю ошибку, говорящую no such table: network.customers но код работает, если я удалю имя приложения, как указано во втором коде. См. имя приложения, включенное во второй код:

sql = "SELECT * FROM network_customers"
customer = Customer.objects.raw(sql)[:10]
print(customer)
print(connection.queries)

Базы данных в settings.py:

DATABASES = {
    'default':{ 
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'network_db':{
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'Network.sqlite3',
    },
    'simulation_db':{
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'Simulation.sqlite3',
    }
}

Network apps.py: from django.apps import AppConfig

class NetworkConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'network'

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

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

from django.db import connections
with connections['network_db'].cursor() as cursor: # use the alias of the database specified in settings.py
        cursor.execute("select * from appname_tablename")
        data = cursor.fetchall()

если у вас только одна база данных в settings.py, вы инициализируете курсор следующим образом:

from django.db import connection
with connection.cursor() as cursor:
        cursor.execute("select * from appname_tablename")
        data = cursor.fetchall()

Можно обратиться к документации по django здесь

Вернуться на верх