python - SQL Server 在客户端数据库的选择中使用 db_owner 前缀
问题描述
我的 Django 应用程序通常在 SQLite3 上运行,但这次我必须将其转换为使用 SQL Server。在测试服务器上一切顺利,但是当我的朋友将此数据库复制到客户端的服务器时,我遇到了错误:
(norm)esd@server:~/Desktop/norm/myproject> python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
Unhandled exception in thread started by <function wrapper at 0x7fc57eb4f8c0>
Traceback (most recent call last):
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run
self.check_migrations()
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/core/management/commands/runserver.py", line 163, in check_migrations
executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/migrations/executor.py", line 20, in __init__
self.loader = MigrationLoader(self.connection)
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/migrations/loader.py", line 49, in __init__
self.build_graph()
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/migrations/loader.py", line 176, in build_graph
self.applied_migrations = recorder.applied_migrations()
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/migrations/recorder.py", line 66, in applied_migrations
return set(tuple(x) for x in self.migration_qs.values_list("app", "name"))
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/models/query.py", line 258, in __iter__
self._fetch_all()
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/models/query.py", line 1074, in _fetch_all
self._result_cache = list(self.iterator())
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/models/query.py", line 128, in __iter__
for row in compiler.results_iter():
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 802, in results_iter
results = self.execute_sql(MULTI)
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 848, in execute_sql
cursor.execute(sql, params)
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/esd/Desktop/norm/lib64/python2.7/site-packages/sql_server/pyodbc/base.py", line 537, in execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'django_migrations'. (208) (SQLExecDirectW)")
当我尝试迁移、运行服务器等时出现错误。
我发现当我直接从 Linux (sqlcmd) 登录数据库时,我也不能做“正常”选择,比如
SELECT * FROM django_migrations;
今天我发现我可以这样使用它:
SELECT * FROM db_owner.django_migrations;
这将是我的问题的结束,但我怎样才能告诉 Django 模型以这种方式使用它或修复数据库?在测试数据库(其他服务器,相同的 SQL Serverversion 等)上一切正常。当我尝试从没有 db_owner 前缀的表中进行选择时,会出现此错误:
django.db.utils.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'django_migrations'. (208) (SQLExecDirectW)")
解决方案
正如 Ivan 所说,我更改了所有表以使用 dbo 模式而不是 db_owner 并且一切都开始工作了!我做了
ALTER SCHEMA dbo TRANSFER db_owner.tableName;
在我的数据库中的每张桌子上。
推荐阅读
- javascript - WKWebView 在脚本加载之前不加载 HTML 内容
- python - 如何从文件夹中随机选择一个文件而不将所有文件读入内存
- javascript - 在类方法中访问对象属性
- php - woocommerce 的 Wordpress 重定向错误
- ruby - 像 PHP 中的内联 RubyDocumentor 行?
- android - 如何使用 rxJava 收集表单输入、评估和有条件地转到另一个视图或发布数据
- python-3.x - 递归函数不更新python中的列表
- javascript - 不需要的 React 组件重新渲染?
- java - 将对象从一个活动传递到另一个活动以更改其值
- c++ - 不能 push_back 包含指向向量的 ofstream 指针的类