django框架从零开始_003_数据库

本文详细介绍了如何在Django项目中使用PostgreSQL数据库,从安装配置到建立模型,再到应用迁移,以及创建数据库表的过程。通过实例演示,帮助开发者快速掌握将PostgreSQL与Django框架结合的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://docs.djangoproject.com/en/1.9/intro/tutorial02/


django支持主流的数据库,包括oracle、mysql、postgre、sqlite。如果只是初探,django提供了默认sqlite的配置,无需再安装其他的。在这里我们尝试使用postgre。

我下载的版本是postgre 9.5.2-1 winx64版,安装完毕之后执行

pip install psycopy2

出错,找不到vcvarsall.bat。貌似是由于没有安装vc的支持。于是干脆去http://www.stickpeople.com/projects/python/win-psycopg/index.html 下载一个for py3.5的版本安装了。


安装完毕,打开mysite/settings.py,找到databases项,进行postgre配置:

DATABASES = {
    #'default': {
    #    'ENGINE': 'django.db.backends.sqlite3',
    #    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #},
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.path.join(BASE_DIR, 'db.postgre'),
    }
}

既然我们使用了非sqlite,那么用户名密码什么的也都要配起来,在https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-DATABASES找到配置参考:

    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.path.join(BASE_DIR, 'db.postgre'),
        'USER': 'postgres',
        'PASSWORD': 'xxx',
        'HOST': 'localhost',
        'PORT': '5432',
    }


对于我们自己的项目,在postgre中建立用户django,再建立一个属于django的数据库mysite,最后分配给它权限:

(执行psql.exe)

create user django with password 'xxx';
create database mysite owner django;
grant all privileges on database mysite to django;

最后的settings.py修改为:

DATABASES = {
    # 'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # },
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mysite',
        'USER': 'django',
        'PASSWORD': 'xxx',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}


OK!

在settings.py中可以看到,顶部有一个INSTALLED_APPS配置,包括了用到的apps。默认包含:

这些apps有些会用到数据库,那么我们执行

python manage.py migrate

来为他们建立数据库。当然如果你不要的可以注释掉。


如果发现有operationError,那检查一下是不是settings里配置没有配对。在idle中也可以调用:

import psycopg2
conn = psycopg2.connect("dbname=mysite user=django password=xxx")
来验证。


现在我们来建立models。model是一个包含域和行为的数据类型的描述(就是MVC里的M)。django中的model遵循DryPrinciple(参考https://docs.djangoproject.com/en/1.9/misc/design-philosophies/#dry)。


下载在我们的polls app中建立两个模型:Question和Choice。Question中包含一个问题和一个发布日期,Choice中包含两部分:文字部分和分数。我们用简单的类来表示这两个model,修改polls/models.py如下:

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

看起来很好理解。这两个model都继承django.db.models.Model。具体可以参考文档 https://docs.djangoproject.com/en/1.9/ref/models/fields/


好了,看起来虽然简单,但是这已经告诉了django框架如何在数据库中建立这两个模型以及生成读写他们的API了。回到刚才的settings文件,把polls也配置到installed_apps中:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

再执行:

python manage.py makemigrations polls
看看结果:


makemigrations 告诉django你做了一些关于你的model的修改并且需要把这些储存在数据库中。实际上Migrations就是储存在硬盘上的文件而已,你可以打开polls/migrations/0001_initial.py,看看django是怎么生成的:

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Choice',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('choice_text', models.CharField(max_length=200)),
                ('votes', models.IntegerField(default=0)),
            ],
        ),
        migrations.CreateModel(
            name='Question',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('question_text', models.CharField(max_length=200)),
                ('pub_date', models.DateTimeField(verbose_name='date published')),
            ],
        ),
        migrations.AddField(
            model_name='choice',
            name='question',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.Question'),
        ),
    ]

实际上你可以自己读取这个migration,或者你想进行修改的话也可以直接修改它。刚才运行了 migrate命令来执行migrations,下面我们用 sqlmigrate来查看django自动生成的sql语句:

python manage.py sqlmigrate polls 0001
结果类似于:



一些默认规则如下:

  • 表名是由app名字加model名字和和下划线构成的(可以修改此行为)
  • PK(IDs)是自动添加的(可以修改此行为)
  • foreignkey是用foreign key显示设置的
  • 一些数据库相关的设定已经自动设置好了,比如mysql的auto_increment,postsql的serial,等
  • sqlmigrate命令并不直接在你的数据库上运行migrations,只是在屏幕里输出将会做什么。如果你有dba的话这会非常有用。
如果需要的话可以跑一下:

可以检查出你的代码有什么错误而不真正的影响数据库。


OK,all set。我们来跑一下migrate:


你的修改已经被同步到数据库了。

可以看出django的migrate功能非常强大,可以让程序员在修改代码的时候不去碰触多余的数据库操作(删table重建之类),而且这个操作可以是实时的。

让我们来回顾一下修改model的三部操作:

  1. 修改models.py文件
  2. 执行manage.py makemigrations 来为这些改动建立migrations文件
  3. 执行manage.py migrate来应用这些修改
这里分三部执行的原因是,你可能会在svn或者其他版本控制系统中check你的文件,这样这些改动也会被别人收到,让别人也可以轻松获取你的修改并应用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值