Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:编程使用';检查数据库';在动态数据库连接上运行时_Python_Django_Database - Fatal编程技术网

Python Django:编程使用';检查数据库';在动态数据库连接上运行时

Python Django:编程使用';检查数据库';在动态数据库连接上运行时,python,django,database,Python,Django,Database,我有一个Django项目,其中每个用户组都有自己的数据库(“项目”)。每个项目都有一个条目,保存在主数据库中。Django从主数据库读取所有当前项目,并与它们的数据库建立连接。这就是为什么不在settings.py中写入连接。动态连接到项目数据库的代码段在根URL.py中运行,因为我从stackoverflow上的另一个线程了解到,那里的代码在启动时运行一次。每当用户创建一个新项目时,一段代码就会创建一个新数据库,并通过向settings.DATABASES添加一个连接来连接到新数据库(请参见下

我有一个Django项目,其中每个用户组都有自己的数据库(“项目”)。每个项目都有一个条目,保存在主数据库中。Django从主数据库读取所有当前项目,并与它们的数据库建立连接。这就是为什么不在settings.py中写入连接。动态连接到项目数据库的代码段在根URL.py中运行,因为我从stackoverflow上的另一个线程了解到,那里的代码在启动时运行一次。每当用户创建一个新项目时,一段代码就会创建一个新数据库,并通过向settings.DATABASES添加一个连接来连接到新数据库(请参见下面的示例代码)。 触发一个外部程序,用数据填充新数据库

现在的问题是我不能立即使用数据库,因为首先我需要运行inspectdb来获取Django的ORM结构。 我希望在运行时执行此操作,因为必须关闭服务器并重新启动它将意味着其他用户在此期间无法使用他们的项目。但即使手动使用命令行,Django也会回答一个错误,即连接不存在。(我猜它试图在settings.py中找到连接?)。但是,对于我已经创建了ORM结构的项目,可以找到连接。因此,我认为问题不在于将连接附加到settings.DATABASES的代码

我试着用计算机解决上面提到的问题

command='python manage.py inspectdb--database'+name+'>api_manager/schemas/'+name+'.py'
操作系统(命令)
但是,如上所述,它引发了一个异常,即连接不存在

在settings.py中,仅存在默认数据库:

数据库={
“默认值”:{
“引擎”:引擎,
“名称”:名称,
“用户”:用户,
“密码”:pwd,
“主机”:主机,
“端口”:端口
}
}
在根URL.py中:

。。。
从myproject.utils导入连接到数据库
URL模式=[
...
]
#一次性执行
对于project.objects.all()中的项目:
连接到数据库(project.slug)
connect_to_db()代码:

def连接到数据库(项目):
设置.数据库[项目]={
“引擎”:settings.ENGINE,
“名称”:项目,
“用户”:settings.USER,
“密码”:settings.pwd,
“主机”:settings.HOST,
“端口”:settings.PORT
}
打印(“连接到数据库:”+项目)
项目创建:

def创建新项目(项目名称):
slug=slugify(项目名称)。替换('-','')
project_dir=os.path.join(settings.MEDIA_ROOT,“projects”,slug)
尝试:
#在默认数据库中创建条目
project=project()
project.name=项目名称
project.slug=slug
project.save()
#创建新数据库
使用connection.cursor()作为游标:
cursor.execute(“创建数据库”+slug)
#在介质中创建项目文件夹
如果操作系统路径不存在(项目目录):
os.mkdir(项目目录)
#创建一些其他文件夹
其他:
引发异常(“项目文件夹已存在!”)
将_连接到_数据库(段塞)
返回项目
除:
提升
在外部程序运行后运行的一段代码:

command='python manage.py inspectdb--database'+name+'>myapp/schemas/'+name+'.py'
os.system(命令)#引发异常连接“name”不存在
我希望Django在运行时创建一个新的ORM(models.py)文件,以便我的用户可以立即使用新生成的数据库


编辑:我用subprocess.run(…)而不是os.system尝试了同样的方法,但仍然没有成功。

我通过rest调用运行这段代码:

from django.core.management import call_command
# base dir from your's project settings
from project_name.settings import BASE_DIR
import os 

with open(os.path.join(BASE_DIR, 'inspected.py'), 'w+') as f
    call_command("inspectdb", stdout=f)
…并在manage.py附近接收结果文件