前要:
apt install postgresql
sudo -u postgres psql # 实际就是切入到postgres(安装的时候默认生成)用户并输入psql
ALTER USER postgres WITH PASSWORD '123456';
pip install psycopg2-binary
基础操作:基本命令
\l --列出所有数据库
\c iotplus --进入数据库
You are now connected to database "iotplus" as user "postgres". --出现此行代表成功
\d --列出数据库中所有的表
\q --退出数据库
基本命令:
sudo service postgresql start 启动
sudo service postgresql stop 关闭
sudo service postgresql status 状态
开启日志(包括普通记录和详细sql执行记录):
gedit /etc/postgresql/12/main/postgresql.conf
(设置下面这几个参数[已经存在,取消注释,修改等于后面的内容即可])
log_statement = all # none, ddl, mod, all
log_truncate_on_rotation = off
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # 文件名
log_directory = '/etc/postgresql/12/main/log' # 日志存放地-路径为了自己能够找到自定义即可
logging_collector = on # 开启日志记录
目录:项目目录/setting.py
写入配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres', # 数据库名称
'USER': 'postgres', # 登录数据库的用户名
'PASSWORD': ' ',# 登录数据库的密码
'HOST': '127.0.0.1', # 数据库服务器的主机地址(默认本机为127.0.0.1)
'PORT': '5432', # 数据库服务的端口号(默认为5432)
}
}
目录:项目目录/app目录/models.py
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
数据类型图:
数据类型参数:
注意:__str__方法用于返回对象的描述信息,如果不使用__str__方法,直接print,或者return,返回的是对象的内存地址
zhangsan = Student("张", 2200)
print(zhangsan) # 如果Student这个class类,没有写__str__方法,输出的是内存地址,但是加上__str__就是值
python3 manage.py makemigrations
python3 manage.py migrate
注意:Ⅰ.比如数据库表单已经生成,需要删除一个字段可以直接再次执行上诉命令;Ⅱ.添加字段必须要为其设置默认值,否则django会进行询问(可写入默认值,可退出该操作)
具体:书Django Web应用开发实战p161开始
from .models import Article
Article.objects.create(title="My first article", body="My first article body")
from .models import Article
Article.objects.get(title="java").delete()
from .models import Article
Article.objects.filter(title="java").delete()
写法:on_delete=models.CASCADE
参数:
# get方式不能用update
from .models import Article
a = Article.objects.get(id=1)
a.foreign_id=3
a.save()
from .models import Article
Article.objects.filter(title='java').update(title='django')
from .models import Article
Article.objects.all()
from .models import Article
article = Article.objects.get(id=1)
from .models import Article
article = Article.objects.filter(name='jack')
from .models import Article
article = Article.objects.filter(name='jack').count()
from .models import Article
article = Article.objects.filter(name='jack',id=5)
from .models import Article
from django.db.models import Q
article = Article.objects.filter(Q(name='jack')|Q(passwd='5963'))
from .models import Article
article = Article.objects.filter(~Q(name='jack'))
知识点:
Info.objects.all()[0].foreign #info是有外键的表,foreign是定义的外键参数名
# 一对一
>>> a = User.objects.all()[0] # User是外键关联表
>>> a.back #back是设置的外键属性related_name
<InfoTwo: 1>
# 一对多
>>> a = Father.objects.all()[0]# Teacher是外键关联表
>>> a.back.all() #back是设置的外键属性related_name
<QuerySet [<Student: 563>, <Student: 563>]>
关系:人的身份证与人的关系,一一对应不可重复
关键概念:
知识点:
Info= models.OneToOneField(User, on_delete=models.CASCADE,related_name=‘back’) # 用于一对一查询
设置外键:
Info.objects.create(id=100,passwd='00',time=12,foreign_id=4) #确保关联表已经有数据
关键是注意这个名字,与models.py里面定义的不一样from django.db import models
# Create your models here.
class User(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
def __str__(self):
return self.name # 必须是字符串
class Info(models.Model):
id = models.AutoField(primary_key=True)
passwd = models.CharField(max_length=30)
time = models.IntegerField()
foreign = models.OneToOneField(User, on_delete=models.CASCADE,related_name=‘back’) # on_delete解释看二、增删改查 2.删
def __str__(self):
return self.passwd # 必须是字符串
关系:父亲与孩子的关系,一个父亲有多个孩子,一个孩子只有一个父亲
知识点:
foreign = models.ForeignKey(Teacher, on_delete=models.CASCADE,related_name=‘back’)
设置外键:
Son.objects.create(id=100,passwd='00',time=12,foreign_id=4) #确保关联表已经有数据
关键是注意这个名字,与models.py里面定义的不一样class Father(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
def __str__(self):
return self.name
class Son(models.Model):
id = models.AutoField(primary_key=True)
passwd = models.CharField(max_length=30)
time = models.IntegerField()
foreign = models.ForeignKey(Teacher, on_delete=models.CASCADE,related_name=‘back’)# on_delete解释看二、增删改查 2.删
def __str__(self):
return self.passwd
关系:老师和学生的关系,一个老师有多个学生,一个学生有多个老师
原理:多对多通过创建中间表格确定对应关系
设置外键:
Student.objects.get(id=1).foreign.set([1,2,3])# 1,2,3默认都是与Student关联表的主键(set的特点:此例设置的Teacher的id的1,2,3关联到Student的id=1上面。如果原关系为1,2会直接改为1,2,3;如果原关系为1,2,3,4,5也会直接改为1,2,3) 总结:既能增加又能删除
Student.objects.get(id=1).foreign.add(1,2)# 1,2默认都是与Student关联表的主键
Student.objects.get(id=1).foreign.remove(1)# 1默认都是与Student关联表的主键
Student.objects.get(id=1).foreign.clear()
class Teacher(models.Model):
id = models.AutoField()
name = models.CharField(max_length=20, primary_key=True)
def __str__(self):
return self.name
class Student(models.Model):
id = models.AutoField(primary_key=True)
passwd = models.CharField(max_length=30)
time = models.IntegerField()
foreign = models.ManyToManyField(Father, on_delete=models.CASCADE, related_name='back')
def __str__(self):
return self.passwd