`
huiqinbo
  • 浏览: 344556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

django 数据模型 导入数据库方法

 
阅读更多

提炼 http://south.readthedocs.org/en/latest/tutorial/part1.html 官方手册里面的步骤

 

在新项目中使用

 

第一步创建项目

 

django-admin.py startproject LearnSouth


创建app

django-admin.py startapp books


在learnSouth.settings中修改数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'demo.db',                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': '',
        'PASSWORD': '',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'south',
    'LearnSouth',
    'books',
)


命令行执行导入数据库

./manage.py syncdb

 

 

 

初始化迁移信息

 

./manage.py schemamigration book --initial


执行完以后会在books目录下看到1个migrations文件夹。里面保存了

0001_initial.py 打开看一下。暂时里面没有数据

 

 

 

修改models.py文件内容

 

from django.db import models

# Create your models here.

class XiaoShuo(models.Model):
    create_date = models.DateTimeField(auto_created=True)
    public_date = models.DateTimeField(auto_now=True)
    title = models.CharField(max_length=128)
    contnet = models.CharField(max_length=512000)

class Comment(models.Model):
    username = models.CharField(max_length=64)
    email = models.CharField(max_length=64)
    # email = models.EmailField()


执行

./manage.py schemamigration books --auto


查看migrations目录。发现生成

0002_auto_add_xiaoshuo_add_comment.py文件。代码为

 

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Adding model 'XiaoShuo'
        db.create_table(u'books_xiaoshuo', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('create_date', self.gf('django.db.models.fields.DateTimeField')()),
            ('public_date', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
            ('title', self.gf('django.db.models.fields.CharField')(max_length=128)),
            ('contnet', self.gf('django.db.models.fields.CharField')(max_length=512000)),
        ))
        db.send_create_signal(u'books', ['XiaoShuo'])

        # Adding model 'Comment'
        db.create_table(u'books_comment', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('username', self.gf('django.db.models.fields.CharField')(max_length=64)),
            ('email', self.gf('django.db.models.fields.CharField')(max_length=64)),
        ))
        db.send_create_signal(u'books', ['Comment'])


    def backwards(self, orm):
        # Deleting model 'XiaoShuo'
        db.delete_table(u'books_xiaoshuo')

        # Deleting model 'Comment'
        db.delete_table(u'books_comment')


    models = {
        u'books.comment': {
            'Meta': {'object_name': 'Comment'},
            'email': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'username': ('django.db.models.fields.CharField', [], {'max_length': '64'})
        },
        u'books.xiaoshuo': {
            'Meta': {'object_name': 'XiaoShuo'},
            'contnet': ('django.db.models.fields.CharField', [], {'max_length': '512000'}),
            'create_date': ('django.db.models.fields.DateTimeField', [], {}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'public_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
            'title': ('django.db.models.fields.CharField', [], {'max_length': '128'})
        }
    }

    complete_apps = ['books']


修改models.py代码为

class XiaoShuo(models.Model):
    create_date = models.DateTimeField(auto_created=True)
    public_date = models.DateTimeField(auto_now=True)
    title = models.CharField(max_length=128)
    contnet = models.CharField(max_length=512000)

class Comment(models.Model):
    username = models.CharField(max_length=64)
    email = models.CharField(max_length=64)
    # email = models.EmailField()


生成0003_auto_chg_field_comment_email.py

import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models


class Migration(SchemaMigration):

    def forwards(self, orm):

        # Changing field 'Comment.email'
        db.alter_column(u'books_comment', 'email', self.gf('django.db.models.fields.EmailField')(max_length=75))

    def backwards(self, orm):

        # Changing field 'Comment.email'
        db.alter_column(u'books_comment', 'email', self.gf('django.db.models.fields.CharField')(max_length=64))

    models = {
        u'books.comment': {
            'Meta': {'object_name': 'Comment'},
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'username': ('django.db.models.fields.CharField', [], {'max_length': '64'})
        },
        u'books.xiaoshuo': {
            'Meta': {'object_name': 'XiaoShuo'},
            'contnet': ('django.db.models.fields.CharField', [], {'max_length': '512000'}),
            'create_date': ('django.db.models.fields.DateTimeField', [], {}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'public_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
            'title': ('django.db.models.fields.CharField', [], {'max_length': '128'})
        }
    }

    complete_apps = ['books']


执行

./manage.py migrate books

 

些时数据库中是最新的数据了!!!

 

 

*********************************************************************************************************

查看sqlite数据库中的内容
当前目录建立或打开test.db数据库文件,并进入sqlite命令终端,以sqlite>前缀标识:
[cdms@cdms LearnSouth]$ sqlite3 demo.db
 
查看数据库文件信息命令(注意命令前带字符'.')
sqlite>.database

查看所有表的创建语句:
sqlite>.schema

 *********************************************************************************************************

 

 

把修改后的模型合并到字段。

 

 

 

在老项目中使用

 

首先把south添加到install_apps变量中。

 

然后执行

 

./manage.py syncdb


之后执行转换,south会假装执行合并过程

./manage.py convert_to_south myapp


项目拷贝到其他机器上使用的过程中。如果修改提交。必须要执行

./manage.py migrate myapp 0001 --fake

 

如果没有数据库的项目,则不需要以上步骤。只需要执行syncdb同步到db。

 

 

 

数据迁移

 

在实践项目中,对模型的的修改往往伴随数据的修改。

 

比如原有的用户表采用了明文密码。在新版本中需要修改为加密的密码。通常开发过程中需要后台和db的配合。

 

后台修改字段,db部分在修改。

 

这里south的强大之处就出来了。可以在代码中修改迁移数据。

 

注意一定要备份数据库

 

下面说说使用demo

 

首先建立1个app

 

./manager.py startapp book2


之后在模型里面添加数据

from django.db import models

class User(models.Model):

    username = models.CharField(max_length=255)
    password = models.CharField(max_length=60)
    name = models.TextField()

 

 

初始化数据记录

./manage.py schemamigration --initial book2

 

 

合并到数据库

./manage.py migrate book2


添加数据

./manage.py shell

User.objects.create(username="andrew", password="ihopetheycantseethis", name="Andrew Godwin")


以上步骤模拟了在实际过程中第一版的开发和数据导入。

接下来更新版本。密码修改为加密部分。

 

首先修改模型

 

from django.db import models

# Create your models here.

import hashlib

class User(models.Model):

    username = models.CharField(max_length=255)
    # password = models.CharField(max_length=60)
    password_salt = models.CharField(max_length=8, null=True)
    password_hash = models.CharField(max_length=40, null=True)
    name = models.TextField()

    def check_password(self, password):
        return hashlib.sha1(self.password_salt + password).hexdigest() == self.password_hash



执行合并数据库

./manage.py schemamigration book2 --auto


下面是好玩的部分。新建1个数据迁移记录

./manage.py datamigration book2 hash_passwords


在 migrations文件夹下面生成1份0003_hash_password.py文件。

修改forwards函数。

 

def forwards(self, orm):
        "Write your forwards methods here."
        # Note: Don't use "from appname.models import ModelName". 
        # Use orm.ModelName to refer to models in this application,
        # and orm['appname.ModelName'] for models in other applications.
        import random, hashlib, string
        for user in orm.User.objects.all():
            user.password_salt = "".join([random.choice(string.letters) for i in range(8)])
            user.password_hash = hashlib.sha1(user.password_salt + user.password).hexdigest()
            user.save()


forwards函数里面。执行了修改密码,导入部分。

回退函数也修改

 

def backwards(self, orm):
        "Write your backwards methods here."
        raise RuntimeError("cannot reverse this migration.")


接下来删除models.py中原始的password字段。

执行合并

 

outekiMacBook-Air:LearnSouth watsy$ ./manage.py schemamigration book2 --auto
/Users/watsy/Documents/code/gitoschina/python/LearnSouth/book2/models.py:7: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
  import sha

 ? The field 'User.password' does not have a default specified, yet is NOT NULL.
 ? Since you are removing this field, you MUST specify a default
 ? value to use for existing rows. Would you like to:
 ?  1. Quit now, and add a default to the field in models.py
 ?  2. Specify a one-off value to use for existing columns now
 ?  3. Disable the backwards migration by raising an exception.
 ? Please select a choice: 2
 ? Please enter Python code for your one-off default value.
 ? The datetime module is available, so you can do e.g. datetime.date.today()
 >>> ""
 - Deleted field password on book2.User
Created 0004_auto__del_field_user_password.py. You can now apply this migration with: ./manage.py migrate book2

 

 

执行合并到数据库

outekiMacBook-Air:LearnSouth watsy$ ./manage.py migrate book2
/Users/watsy/Documents/code/gitoschina/python/LearnSouth/book2/models.py:7: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
  import sha

Running migrations for book2:
 - Migrating forwards to 0004_auto__del_field_user_password.
 > book2:0002_auto__add_field_user_password_salt__add_field_user_password_hash
 > book2:0003_hash_passwords
 - Migration 'book2:0003_hash_passwords' is marked for no-dry-run.
 > book2:0004_auto__del_field_user_password
 - Loading initial data for book2.
Installed 0 object(s) from 0 fixture(s)


测试执行以后的数据库是否修改密码成功

outekiMacBook-Air:LearnSouth watsy$ ./manage.py shell

>>> from book2.models import User
>>> User.objects.get(id=1).check_password("258841679")
True
>>> User.objects.get(id=1).check_password("fakepass")
False


测试修改成功~

分享到:
评论

相关推荐

    Django引用ztree实现数据库表导入树状目录

    通过以上步骤,我们可以在Django项目中成功实现从MySQL数据库导入数据表,并以ZTree的形式展示,为用户提供直观、交互式的树状目录。这样的功能在数据管理、文件系统展示等多个场景中都非常实用。在实际开发中,还...

    django将图片上传数据库后在前端显式的方法

    涉及的知识点包括Django模型(Model)、视图(View)、模板(Template)、表单(Form)和静态文件的配置等。 首先,我们需要在Django的模型中定义好用于存储图片的字段。这里我们使用了`ImageField`字段,它是专门...

    Python-Django模型字段加密解密您的数据并加密保存至数据库中

    luojilab-django-mirage-field-5d96836是一个这样的库,它提供了一种简单的方法来加密Django模型的字段。通过这个库,我们可以在保存到数据库之前自动加密数据,在从数据库读取后自动解密。这样,即使数据库被非法...

    django+scrapy结合

    为了将数据存入Django的数据库,我们需要创建一个Scrapy Pipeline,利用`scrapy-djangoitem`将Scrapy Item映射到Django模型,然后通过Django ORM将数据插入数据库。 6. **创建Django模板**:设计前端页面,让用户...

    基于Django与HDFS的分布式三维模型文件数据库构建.pdf

    对于模型数据库的研究,在构建三维场景时,用户需要进行模型的检索、导入和移除等操作。而通过HDFS分布式存储和Django框架的结合,我们可以构建一个云端分布式三维数据存储系统。该系统支持“云集中”存储,用户只需...

    Django数据库内省工具通过数据表名就可以动态创建一个即时可用的Djangomodels对象

    总的来说,Django的数据库内省工具为我们提供了一种便捷的方式,使我们能快速地将现有的数据库结构映射到Django模型中,减少了重复的工作,提高了开发效率。在实际项目中,可以根据具体需求对其进行调整和优化,以...

    使用scrapy爬取房天下的房子信息,将数据导入数据库使用django搭建一个房子网站.zip

    在获取数据后,下一步是将这些数据导入到数据库。可以使用Python的数据库适配器,如psycopg2(PostgreSQL)或pyodbc(MySQL)等,与数据库进行交互。一般来说,你会先创建一个数据库模型,对应房子的信息字段,然后...

    Django 查询数据库并返回页面的例子

    在Django项目中,模型(Model)代表了数据库中的数据结构,视图(View)负责处理用户的请求并返回相应的响应,而模板(Template)则用于定义输出的HTML结构。 在本例中,我们将实现一个简单的功能:根据用户的名称...

    Django import export实现数据库导入导出方式

    ### Django Import Export 实现数据库导入导出方式 #### 一、引言 在现代Web开发中,特别是基于Python的Django框架项目中,数据管理变得越来越重要。在这些项目中,经常需要处理大量的数据导入与导出操作。例如,...

    django 将自带的数据库sqlite3改成mysql实例

    现在,Django的数据库配置已经完成,但数据库中的模型(即数据表)尚未创建。Django使用ORM(对象关系映射)来处理数据库操作。在`models.py`文件中定义你的模型类,例如: ```python from django.db import models...

    我的Django专栏036阶段的数据库文件

    模型类位于应用的`models.py`文件中,它们定义了数据库表的字段、类型、约束以及方法。例如: ```python from django.db import models class amo(models.Model): name = models.CharField(max_length=50) age =...

    python棉花数据平台建设与可视化系统(django)源码数据库演示.zip

    2. **数据库设置**:根据文档配置数据库连接信息,可能需要导入预先提供的数据库脚本以初始化数据。 3. **运行服务器**:在命令行中运行Django的`manage.py`脚本启动服务器,然后通过浏览器访问指定的URL查看和使用...

    使用python语言Django网络框架编写的跳蚤市场项目,可做毕业设计,内涵mysql数据库文件可直接导入mysql数据库

    项目包含一个可以直接导入到MySQL的数据库文件,这意味着项目已经预设好了数据表结构,可能包括用户表、商品表、订单表等。 5. **Django ORM**: Django的ORM(对象关系映射)允许开发者使用Python对象来操作数据库...

    python Django批量导入数据

    最后,通过`LOrder.objects.bulk_create(WorkList)`一次性创建所有模型实例,将数据导入数据库。 在实践中,可能会遇到一些问题: 1. 数据格式问题:如果数据源的第一行是字段名,且字段名包含非数字字符,如日期...

    Django基础Python335Django165.docx

    《Django基础Python335Django165.docx》文档主要讲解了Django框架中与数据库交互的基础知识,特别是在视图中...对于初学者,即使没有深厚的数据库和SQL背景,也能通过学习Django模型快速上手数据库驱动的Web应用开发。

    django批量导入xml数据

    首先,我们需要为XML数据创建对应的Django模型。模型是数据库表的Python表示,定义了字段类型和属性。在本例中,有两类模型:`SVNLog` 和 `ImportLogFile`。`SVNLog` 模型代表单个SVN日志条目,包含修订版本、作者、...

    python基于深度学习的音乐推荐方法研究系统(django)源码数据库演示.zip

    为了运行此项目,你需要安装Python环境,设置好Django和所需的深度学习库(如TensorFlow或PyTorch),导入数据库并导入预处理好的音乐数据,配置项目设置,如数据库连接、应用路由等,最后运行Django服务器即可进行...

    Python-基于inception和django的数据库web管理平台

    在这个Web管理平台上,Inception可能被用作后端服务,处理与数据库相关的操作,比如SQL查询、数据导入导出、数据库备份和恢复等。通过Django的视图和模板,用户可以直观地在Web界面上执行这些操作。 3. 数据库Web...

    基于python+Django招聘数据分析可视化系统源码数据库.zip

    1. Django框架的使用:理解Django的URL路由、视图函数、模板系统以及模型定义,实现数据的CRUD操作。 2. 数据库操作:运用Django ORM进行数据库设计和操作,理解SQL语句与ORM的转换。 3. 网络爬虫:使用requests和...

    Django 数据库表的建立与增删查改

    首先,数据库表的建立是在Django的模型(model)层面上定义的。Django的ORM(对象关系映射)系统允许我们将数据库表表示为Python类。每个类都对应一个数据库表,类中的属性则对应表中的列。例如,在app文件夹下的...

Global site tag (gtag.js) - Google Analytics