Python 如何强制django从shell重新启动数据库连接?

Python 如何强制django从shell重新启动数据库连接?,python,django,Python,Django,我有一个关于数字海洋服务器的django项目。从本地计算机,我通过ssh连接到数据库: ssh -L 63333:localhost:5432 me@my.server 并将my local settings.py更改为: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': '', 'USER': '',

我有一个关于数字海洋服务器的django项目。从本地计算机,我通过ssh连接到数据库:

ssh -L 63333:localhost:5432 me@my.server
并将my local settings.py更改为:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '',
        'USER': '',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': 63333
    }
}
在本地机器上的Jupyter QT控制台上,我按照以下步骤进行设置:

import os
import django
os.chdir('/path/to/my/project')
os.environ['DJANGO_SETTINGS_MODULE'] = 'my_project.settings'
django.setup()
在我的ssh连接因某种原因中断之前,一切正常。首先,我得到了这个错误(在查询数据库的一行上,比如说,
my_model.objects.First()
):

当我通过ssh重新连接时,我不断收到以下错误:

InterfaceErrorTraceback (most recent call last)
/home/ayhan/anaconda3/lib/python3.6/site-packages/django/db/backends/base/base.py in _cursor(self, name)
    233         with self.wrap_database_errors:
--> 234             return self._prepare_cursor(self.create_cursor(name))
    235 

/home/ayhan/anaconda3/lib/python3.6/site-packages/django/db/backends/postgresql/base.py in create_cursor(self, name)
    211         else:
--> 212             cursor = self.connection.cursor()
    213         cursor.tzinfo_factory = utc_tzinfo_factory if settings.USE_TZ else None

InterfaceError: connection already closed
只有重新启动IPython内核,错误才会消失。我尝试对设置执行相同的步骤。我还尝试了importlib import-reload中的
;重新加载(django)
,然后再次执行设置,但无论发生什么,都会出现相同的错误


有时这种情况会发生,因为我不想在内存中丢失变量,所以我希望避免重新启动内核。有没有办法在没有数据库连接的情况下重新创建数据库连接?我使用的是Python3.6和django 2.0.0。

您可以使用如下内容

from django.db import connections
conn = connections['default']
conn.connect()

然后调用connection.cursor将获得一个新的连接, django源代码:

def _cursor(self, name=None):
    self.ensure_connection()
    with self.wrap_database_errors:
        return self._prepare_cursor(self.create_cursor(name))

conn.close\u if\u unusable\u或\u ocated()---这段代码对我非常有用。非常感谢!短的那个很酷!
from django.db import connection
connection.connect()
from django.db import connections, connection
for conn in connections.all():
    conn.close_if_unusable_or_obsolete()
def _cursor(self, name=None):
    self.ensure_connection()
    with self.wrap_database_errors:
        return self._prepare_cursor(self.create_cursor(name))