2014-01-07 50 views
1

我想使用外部脚本预填充我的数据库。脚本如下从外部脚本访问django sqlite数据库

# -*- 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没有创建。

+1

,但在设置你怎么有定义的数据库结构文件? – Juliusz

+0

你的意思是怎样的? ENGINE':'django.db.backends.sqlite3',。 'NAME':'geoedu.db',... etc 它与project_dir在相同的目录中创建,您可以从树命令中看到。 – Apostolos

+0

工作......猜测使用sqlite3时,数据库的名称必须始终是路径而不只是名称。感谢@Juliusz为我指出了正确的方向 – Apostolos

回答

0

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

但之前,你有你的SQLite数据库

对于这个创建表“骨架”,你只需要通过做与Django的数据库同步:

python manage.py syncdb 

这有可能只做一次。在未来,您可能需要使模型发展(因此需要类似的数据库变更),此时南方或特殊模式进化查询将会很有用(http://south.aeracode.org/),但就您原型设计而言,你可以删除数据库,并通过执行syncdb重新创建好表格

+0

Syncdb正常执行 – Apostolos

0

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

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

和一切正常,因为它应该。 PROJECT_DIR是

SETTINGS_DIR = os.path.dirname(__file__) 

因此数据库是在设置文件夹内创建的。如果你想里面的项目目录,你应该做的

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