参考: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',
}
}
在settings.py中可以看到,顶部有一个INSTALLED_APPS
配置,包括了用到的apps。默认包含:
django.contrib.admin
– 管理工具.django.contrib.auth
– 权限管理.django.contrib.contenttypes
–内容.django.contrib.sessions
– session.django.contrib.messages
– 消息处理.django.contrib.staticfiles
– 统计信息.
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的话这会非常有用。
你的修改已经被同步到数据库了。
可以看出django的migrate功能非常强大,可以让程序员在修改代码的时候不去碰触多余的数据库操作(删table重建之类),而且这个操作可以是实时的。
让我们来回顾一下修改model的三部操作:
- 修改models.py文件
- 执行manage.py makemigrations 来为这些改动建立migrations文件
- 执行manage.py migrate来应用这些修改