【问题标题】:Querying / Retrieving Data from SQL Server using Django使用 Django 从 SQL Server 查询/检索数据
【发布时间】:2018-04-08 05:31:48
【问题描述】:

我对 Django 很陌生。我正在尝试使用 Django 应用程序从 SQL 服务器查询数据。我能够连接到默认的 Django 数据库并从那里获取数据,但是当我尝试查询现有数据库时,Django 不断抛出错误。 (对于此处格式的缩进错误表示歉意,但在我的脚本中没问题)

views.py 显示以下错误:

from django.http import HttpResponse
from django.template import Context,Template,RequestContext
from django.shortcuts import render_to_response, render
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.template.context_processors import csrf
from ForecastApp.forms import *
from django.core.mail import send_mail
from django.utils.safestring import mark_safe
#from django.db import connection
import os
import csv
import json
import subprocess
from subprocess import *
from operator import itemgetter
from datetime import datetime
import pyodbc
from logging import getLogger
from .models import Actuals
from .models import forecastfuture
ss = forecastfuture.objects.using('default').all()
    print len(ss)
    for row in ss:
        print (row.region) #works fine
tt = Actuals.objects.using('Forecasting').all()
    print len(tt)
        for row in tt:
            print (row.Region)

[Microsoft][SQL Server Native Client 11.0][SQL Server]列名“id”无效。 (207)

我已经按照文档中的说明设置了 routers.py 和 models.py 和 settings.py。

路由器.py

class App1Router(object): #pardon my poor indentations here while posting
def db_for_read(self, model, **hints):

    if model._meta.app_label == 'ForecastApp':
        return 'Forecasting'
    return 'default'

def db_for_write(self, model, **hints):

    if model._meta.app_label == 'ForecastApp':
        return 'Forecasting'
    return 'default'

def allow_relation(self, obj1, obj2, **hints):

    if obj1._meta.app_label == 'ForecastApp' and obj2._meta.app_label == 'ForecastApp':
        return True
    # Allow if neither is chinook app
    elif 'ForecastApp' not in [obj1._meta.app_label, obj2._meta.app_label]:
        return True
    return False

def allow_syncdb(self, db, model):
    if db == 'Forecasting' or model._meta.app_label == "ForecastApp":
        return False # we're not using syncdb on our legacy database
    else: # but all other models/databases are fine
        return True

models.py

class Actuals(models.Model):
    date = models.DateTimeField(db_column='Date', blank=True, null=True)
    values = models.FloatField(db_column='Values', blank=True, null=True)
    region = models.CharField(db_column='Region', max_length=50, blank=True, null=True)
    metric = models.CharField(db_column='Metric', max_length=50, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'actuals'

class migrations(models.Model):
    app =models.CharField(max_length=255)
    name =models.CharField(max_length=255)
    applied = models.DateTimeField()

class forecastfuture(models.Model):
    caseId = models.IntegerField(null=False)
    date = models.DateField(null=False)
    forecast=models.FloatField(null=False)
    metric = models.CharField(max_length=255,null=False)
    region = models.CharField(max_length=255,null=False)

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc', 
        'NAME': 'ForecastAppDjango',   
        'USER': '',                    
        'PASSWORD': '',                
        'HOST': 'abc.com\\sql',        
        'PORT': '1433',                
        'OPTIONS': {
                'host_is_server': True,
                'driver' : 'SQL Server Native Client 11.0',
                'trusted_connection':'yes',

        },
    },

    'Forecasting': {
        'ENGINE': 'sql_server.pyodbc', 
        'NAME': 'Forecasting',         
        'USER': '',                    
        'PASSWORD': '',                
        'HOST': 'abc.com\\sqlt',.
        'PORT': '1433',         
        'OPTIONS': {
                'host_is_server': True,
                'driver' : 'SQL Server Native Client 11.0',
                'trusted_connection':'yes',

        },
    }
}

DATABASE_ROUTERS = ['ForecastApp.routers.App1Router']

到目前为止,我已经尝试过:manage.py makemigrations 并成功迁移命令。

实际值表是:

| Date | Values | Region | Metric|
|2012-01-01 00:00:00.000 | 1000 | Region1 | Demand |

manage.py inspectdb --database "Forecasting" 也可以。

Q1:外部数据库预测没有主键。这是一个要求吗? Q2:我在 views.py 或 models.py 中做错了什么?

提前感谢您的建议。

【问题讨论】:

  • 是的,拥有主键是 Django 模型中的一项要求。
  • 我知道这是 Django 创建的数据库(在我的情况下为默认数据库)的要求。但是查询外部数据库 SQL server 是真的吗?请确认。您将如何查询您无法控制的数据库?

标签: python sql-server django


【解决方案1】:

Q2 : 我认为你的表 forecastfuture 和 Actuals 有不同的结构 id 列在表 forecastfuture 中是额外的

【讨论】:

  • 感谢您的回复。 predictfuture 是由 django 创建的数据库(ForecastAppDjango)创建的表,Actuals 是来自外部数据库(Forecasting)的表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 2014-06-29
  • 1970-01-01
相关资源
最近更新 更多