从外部脚本访问 django sqlite db

Posted

技术标签:

【中文标题】从外部脚本访问 django sqlite db【英文标题】:Access django sqlite db from external script 【发布时间】:2014-01-07 14:54:59 【问题描述】:

我想使用外部脚本预填充我的数据库。脚本如下

# -*- 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 不会被创建。

【问题讨论】:

但是你是如何在设置文件中定义DATABASES结构的呢? 你是什么意思?引擎': 'django.db.backends.sqlite3', . 'NAME': 'geoedu.db',...etc 从 tree 命令中可以看到,它与 project_dir 在同一目录上创建。 工作...猜猜使用 sqlite3 时,数据库的名称必须始终是路径,而不仅仅是名称。感谢@Juliusz 为我指明了正确的方向 不客气 - 现在把答案放在下面并批准它;) 【参考方案1】:

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

但是,在此之前,您必须在您的 sqlite db 中创建表“骨架”

为此,您只需通过以下方式将数据库与 Django 同步:

python manage.py syncdb

这只能做一次。

将来,您可能需要使您的模型演变(因此需要类似的数据库演变),此时 South - 或临时模式演变查询 - 将很有用 (http://south.aeracode.org/) 但就您而言原型,你可以删除 db 并通过执行 syncdb 用好的表重新创建它

【讨论】:

Syncdb 已正常执行【参考方案2】:

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

'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'))

【讨论】:

以上是关于从外部脚本访问 django sqlite db的主要内容,如果未能解决你的问题,请参考以下文章

Django:从本地开发推送时,SQLite 在 Heroku 上覆盖 POSTGRESQL db

如何修复:Jooq 代码不会从 sql 脚本为内存 db 中的 sqlite 生成 java 代码

从SD卡访问Sqlite DB会出错

Cordova Android:从任意目录打开 SQLite .db 数据库

如何查看 django sqlite3 db 的数据库和模式

不忽略 db.sqlite3 文件,即使我在 django 项目的 .gitignore 中指定