Почему я получаю сообщение "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 здесь