从外部脚本访问django sqlite db

时间:2014-01-07 14:54:59

标签: 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'

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并使用它(它是空的,没有student_student表的课程)

为什么会发生这种情况?PROJECT_DIR是正确的(打印出来的)并且是树的根,它是最重要的geodedu。

编辑:创建新学生时会创建新的geoedu.db。如果我注释掉那些行,则geoedu.db不会被创建。

2 个答案:

答案 0 :(得分:0)

在Django中定义模型可以帮助您操作实例。

但是,之前,您必须在sqlite db

中创建表“skeleton”

为此,您只需要通过执行以下操作将db与Django同步:

python manage.py syncdb

这必须只进行一次。

将来,您可能需要让模型发展(因此需要类似的数据库演进),此时南方 - 或者特殊模式演化查询 - 将非常有用(http://south.aeracode.org/),但就您而言在进行原型设计时,您可以通过执行syncdb

来删除db并使用良好的表重新创建它

答案 1 :(得分:0)

问题是我没有在settings.py文件中使用数据库名称的绝对路径。我在数据库引擎的名称中添加了这个

'NAME':os.path.join(SETTINGS_DIR,'geoedu.db')

并且一切正常。 PROJECT_DIR是

SETTINGS_DIR = os.path.dirname(__file__)

所以数据库是在settings文件夹中创建的。如果你想要内部项目文件夹,你应该做

'NAME':os.path.abspath(os.path.join(SETTINGS_DIR,'..','geoedu.db'))