Django+Postgresql

Nosql课上的一个小练习,使用postgresql,然后写一个简单的web
Ubuntu18.04 python3.6 django==2.0.1 自带postgresql

我现在系统里有三个版本的python和两个版本的django,造成了我因为版本问题挠头挠头挠秃了。
其实是想说如果项目抛些不是代码的错的错,那要看看是不是版本乱了。
好啦,先开始说说使用pgsql

PostgreSql简单使用

进入postgresql:sudo -i -u postgres进入postgres用户,然后输入:psql输入密码进入了pgsql

基本操作

然后是一些基本操作:大家也可以用\h \?来查看

操作命令
查看数据库\l
创建数据库create database testdb;
删除数据库drop database testdb;
切换数据库\c databasename
查看表\dt
创建表create table test (id integer, score jsonb);
删除表drop table test

增删改查命令:

操作命令
插入语句insert into t_table values (1,‘{“name”:“p”,“math”:90}’::jsonb)
删除语句delete from t_table where id = 2
更新语句update t_table set id=3 where id=33
查询语句select * from t_table where id = 6

好多都和mysql啊sqlserver啊都差不多的,
不过pgsql有和他们都不一样的地方,它有json和jsonb类型,其实主要学的也就是json和jsonb结构。

json 和 jsonb

嗯。。我要开始把老师课件搬过来了 嘻嘻嘻
这俩结构有啥不同:

两者从用户操作的角度来说没有区别,区别主要是存储和读取的系统处理(预处理)和耗时方面有区别。简单的说就是:json写入快,读取慢,jsonb写入慢,读取快。

还有json和jsonb的一些基本操作符,我就直接截了两张图:
可以直接从这儿看到更多 (https://www.postgresql.org/docs/9.5/static/functions-json.html)
json操作符
jsonb操作符

关于索引

索引这里我还是懵呼呼的,
创建索引语句: create index index_name on table_name (字段名)

在我数据库中我是这么创建的:

create index score_index on student_student using gin(score jsonb_path_ops);

django连接pgsql

django一些配置

settings.py文件,把默认的sqlite3数据库注释掉,写进自己的postgresql

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'pgsql', #数据库名字
        'USER': 'postgres', #用户名
        "PASSWORD" : 'password', #自己的密码
        "HOST":'',
        'PORT':5432,
    }
}

如果是python连接pgsql的话需要安装好psycopg2 和 psycopg2-binary包,直接用pip安装就可以了,pycharm的话还要自己手动在setting中加一下,才可以用。用django的话,上面两个包应该不需要,但是会有warning。
然后去写我们的model:

from django.db import models
from django.contrib.postgres.fields import JSONField

class student(models.Model):
    score = JSONField()
    def __str__(self):
        return str(self.score)

用django还没多少日子,还是一个小白,一开始也不知道有自带的json类型,在百度上出来的结果也不算多,然后自己傻fufu的用python连接数据库,傻瓜式的写sql语句插入,而且这个sql语句很是不好写,因为某些引号要求真的是。。
其实都是我不爱看官方文档,不看文档都是因为我不想要看英文,😦 官方文档里面写的很清楚明白,最后最后在昨天晚上,我,终于看到了这个(https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/fields/),哇塞好棒!

django提供了postgre的特殊的类型,比如ArrayField列表,CIText fields不区分大小写的text,HStoreField有序的json,JSONField还有我一直一直找的json类型,其实这个对应的是jsonb类型,还有些其它的,我也没有多看。

上面的配置好了之后(别忘了把app加入到settings中哦),可以执行makemigrations 和migrate命令啦,详细的我就不写啦。

在我的pgsql数据库里面也已经建好了表。

插入10000条数据

练习的要求是:

在PostgreSQL中建立一张表< id, score> ,其中score为jsonb类型,为每位同学的各科成绩(语文、数学、英语、化学、地理等,每人可能不一样)
使用程序往该表中插入1万(或10万)条记录,数据随机生成

我的插入数据代码

#插入数据
def insert():
    #科目列表 随机取
    subject_list = ['math','chinese','english','chemical','physics','geography','biology']
    #插入1万条随机数据
    for i in range(0,10000):
        record = {} # 插入的每条记录
        score = {} # 每条记录里的分数
        # 姓名随机 其实就是随机生成了个字符串
        name = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(5))
        # 随机插入 x 个成绩信息
        for i in range(0,random.randint(1,7)):
            #随机选取科目,随机生成分数(50-100分)
            score[subject_list[random.randint(0,6)]] = random.randint(50,100)
        #生成记录
        record['name'] = name
        record['score'] = score
        # print(i,record)
        #写入数据库
        student.objects.create(score=record)
# insert()

写入数据库的代码是这句:

student.objects.create(score=record)

还有查询,查询数学成绩:

list = student.objects.filter(score__score__math__isnull = False)

对应着的sql语句:

select * from student_student where score - >'score'  ?  'math';
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值