【问题标题】:Django adds square Brackets in querying sql serverDjango在查询sql server时添加方括号
【发布时间】:2016-11-06 08:41:54
【问题描述】:

我正在尝试从 mac osx 上的 django 连接到 azure sql 服务。 当我关注时

from photo_mapper.models import Restaurant
rest_query = Restaurant.objects.all().query
print rest_query
SELECT [ate_it.restaurant].[id], [ate_it.restaurant].[name], [ate_it.restaurant].[area], [ate_it.restaurant].[city], [ate_it.restaurant].[submitter], [ate_it.restaurant].[pending], [ate_it.restaurant].[zid] FROM [ate_it.restaurant]

因此,当我做Restaurant.objects.all() 时,我得到了

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/django/db/models/query.py", line 234, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/django/db/models/query.py", line 258, in __iter__
    self._fetch_all()
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/django/db/models/query.py", line 1074, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/django/db/models/query.py", line 52, in __iter__
    results = compiler.execute_sql()
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 848, in execute_sql
    cursor.execute(sql, params)
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/anubhav/workspace/ate-it/venv/lib/python2.7/site-packages/sql_server/pyodbc/base.py", line 538, in execute
    return self.cursor.execute(sql, params)
ProgrammingError: ('42S02', "[42S02] [FreeTDS][SQL Server]Invalid object name 'ate_it.restaurant'. (208) (SQLExecDirectW)")

但是,当我使用 django.db.connections 手动运行查询 SELECT * from ate_it.restaurant 时,它运行良好。 我可以阻止 django 添加方括号吗?

我的数据库设置是

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'mydatabase',
        'USER' : 'myuser',
        'PASSWORD' : 'mypwd',
        'HOST' : 'myserver',
        'PORT' : '1433',
    }
}

我关注 this link 进行 freetds 和 unixodbc 设置

【问题讨论】:

  • 您在 Python 和 Django 中使用什么包和版本?有几个;我猜 pyodbc==3.0.10,但是哪个 Django 包? ate_it.restaurant是模式+表名的组合吗?
  • 我使用的是 Django 1.9.7。 ate_it 是架构,餐厅是表名

标签: python sql-server django pyodbc freetds


【解决方案1】:

这是因为 pyodbc.它生成表、索引或列的引用名称。 在 pyodbc/operations.py 中修改这个函数 quote_name 将此行
return '[%s]' % name 更改为 return name

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2014-12-31
    相关资源
    最近更新 更多