Python 从外部脚本访问django sqlite数据库
我想使用外部脚本预填充数据库。脚本如下Python 从外部脚本访问django sqlite数据库,python,django,sqlite,external-script,Python,Django,Sqlite,External Script,我想使用外部脚本预填充数据库。脚本如下 # -*- coding:utf-8-*- import os, sys from random import choice PROJECT_DIR = os.path.abspath(os.path.join(os.path.abspath(__file__),'..','..')) sys.path.append(PROJECT_DIR) os.environ['DJANGO_SETTINGS_MODULE']='geoedu.settings'
# -*- coding:utf-8-*-
import os, sys
from random import choice
PROJECT_DIR = os.path.abspath(os.path.join(os.path.abspath(__file__),'..','..'))
sys.path.append(PROJECT_DIR)
os.environ['DJANGO_SETTINGS_MODULE']='geoedu.settings'
from school.models import School
from student.models import Student
if __name__=='__main__':
student = Student(first_name=choice(first_names_males), last_name=choice(last_names_males),
father_name=choice(first_names_males), mother_name=choice(first_names_females),
mobile=choice(mobiles), telephone=choice(telephones))
student.save()
其中选择的参数是带有姓名和电话的列表。当我运行它时,虽然我得到以下错误
django.db.utils.DatabaseError: no such table: student_student
目录树
geoedu
├── geoedu
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ ├── urls.pyc
│ ├── wsgi.py
│ └── wsgi.pyc
├── geoedu.db
├── geoedu.sublime-project
├── geoedu.sublime-workspace
├── manage.py
├── school
│ ├── admin.py
│ ├── admin.pyc
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── models.py
│ ├── models.pyc
│ ├── tests.py
│ └── views.py
├── scripts
│ └── populate.py
└── student
├── admin.py
├── admin.pyc
├── __init__.py
├── __init__.pyc
├── models.py
├── models.pyc
├── tests.py
└── views.py
它所做的是在脚本文件夹中创建一个新的geoedu.db并使用它(它是空的,没有学生表)
为什么会发生这种情况?PROJECT_DIR是正确的(打印出来的),并且是树的根,树的顶部是geodedu
编辑:创建新学生时将创建新geoedu.db。如果我注释掉那些行,geoedu.db不会被创建 在Django中定义模型可以帮助您操作实例 但是,在此之前,必须在sqlite数据库中创建表“骨架” 为此,您只需通过以下操作将db与Django同步:
python manage.py syncdb
这只能做一次
在未来,您可能需要使您的模型进化(因此需要类似的数据库进化),此时South或adhoc schema进化查询将非常有用(),但就您的原型而言,您可以通过执行syncdb删除数据库并使用good table重新创建它。问题是我在settings.py文件中没有为数据库名称使用绝对路径。我以数据库引擎的名义添加了这个
'NAME':os.path.join(SETTINGS_DIR,'geoedu.db')
一切都正常运转。_DIR项目是
SETTINGS_DIR = os.path.dirname(__file__)
因此,数据库是在“设置”文件夹中创建的。如果你想在项目文件夹内,你应该这样做
'NAME':os.path.abspath(os.path.join(SETTINGS_DIR,'..','geoedu.db'))
但是你是如何在设置文件中定义数据库结构的?你是什么意思?引擎':'django.db.backends.sqlite3',.'NAME':'geoedu.db',…等等它是在与项目目录相同的目录上创建的,正如您可以从tree命令中看到的那样。已工作…猜测使用sqlite3时,数据库的名称必须始终是路径,而不仅仅是名称。感谢@Juliusz为我指明了正确的方向不客气-现在把答案放在下面并批准它;)Syncdb正常执行