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)
关于索引
索引这里我还是懵呼呼的,
创建索引语句: 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';