| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 数据库相关概念与编程使用方式 -> 正文阅读 |
|
[大数据]数据库相关概念与编程使用方式 |
CSDN主页:jcLee95 邮箱:291148484@163.com 1. 数据库基本术语
1.1 数据库(DB)是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。它能为各种用户共享,具有较小冗余度,数据间联系紧密而又有较高的数据独立性的特点。 1.2. 数据库管理系统(DBMS)是位于用户(User)与操作系统(Operation System, OS)之间的一层数据库管理软件。 1.3. 数据库系统(DBS)是实现有组织动态地存储大量关联数据,方便多用户访问的计算机软硬件和数据库资源组成的系统。也就是说,数据库系统是采用数据库技术的计算机系统。 1.4. 数据库技术是研究数据的结构、存储、设计、管理和使用的一门软件学科。 2. 数据库的常见分类3. 概念设计中的数据描述3.1 实体(entity)
3.2 实体集(entity set)
3.3 属性(attribute)
3.4 实体标识符(identifier)| 键/关键码(key)
4. 逻辑设计中的数据描述4.1 字段(field)| 数据项
4.2 记录(record)
4.3 文件(file)
4.4 关键码(key)
4.5
|
概念设计中的数据描述 | 逻辑设计中的数据描述 |
---|---|
实体 | 记录 |
实体集 | 文件 |
属性 | 字段(数据项) |
实体标识符 | 关键码 |
id | 品牌 | 型号 | 类别 | 颜色 | 生产年份 | 人气值 | 报价 |
---|---|---|---|---|---|---|---|
1 | 兰博基尼 | LP770-4 | 超跑 | 黑色 | 2016 | 95 | 700W |
2 | 兰博基尼 | LP770-4 | 超跑 | 黄色 | 2017 | 98 | 730W |
这里有2条关于兰博基尼的记录的表,每个记录都有8个字段,分别是id、品牌、型号、类别、颜色、生产年份、人气值、报价他们所分别对应的列。这些字段从自己的角度描画了该条记录在某一个方面的属性,这个表就是一个同一类记录的集合即文件。而各列的标识字符串,如“品牌”、“型号”等等,用来唯一标识每条记录的字段,即关键码。
【联系】(relationship):指的是 实体
之间的相互关系。
元数
;一对一联系
、 一对多联系
、 多对多联系
,分别介绍如下:两个实体集E1和E2,它们中各自的任意一个实体对对方实体集中的有且仅有一个实体有联系。这种二元联系即“一对一联系”。
两个实体集E1和E2,如果E1中的一个实体与E2中的任意多个实体有联系,但E2中的实体之多只与E1中的一个实体有联系,这种二元联系即“一对多联系”。
两个实体集E1和E2,如果E1中的一个实体与E2中的任意多个实体有联系,同样E2中的一个实体与E1中的任意多个实体有联系,这种二元联系即“多对多联系”。
游标
游标
就是提供这种机制的载体,它是对结果集的一种扩展方案。其特点如下:
pip install pymysql
首先,创建名为’users’表的SQL语句如下:
create table `users` (
`id` int(11) NOT NULL auto_increment,
`email` varchar(255) collate utf8_bin not null,
`password` varchar(255) collate utf8_bin not null,
primary key(`id`)
) engine=InnoDB default charset=utf8 collate = utf8_bin
auto_increment=1;
import pymysql
# 连接到该数据库
connection = pymysql.connect(host = 'localhost', # 指定主机名
user = 'user', # 指定用户名
password = 'passwd', # 指定用户密码
db = 'db', # 指定数据库名称
charset = 'utf8mb4', # 指定字符编码方式
cursorclass = pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor: # cursor()方法用于创建一个游标对象
# 创建一条新记录
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)" # SQL语句字符串(这是一个模板字符串)
cursor.execute(sql, ('webmaster@python.org', 'very-secret')) # 通过打开一个游标查询
# execute()方法用于只从SQL查询
connection.commit() # 默认情况下,连接不会自动提交。所以你必须提交保存你的更改
with connection.cursor() as cursor:
# 读取一条记录
sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s" # SQL语句字符串
cursor.execute(sql, ('webmaster@python.org',))
result = cursor.fetchone() # 返回的是一个json格式字符串
print(result)
finally:
connection.close()
class pymysql.connections.Connection(
host=None, user=None, password='',
database=None, port=0,
unix_socket=None, charset='',
sql_mode=None, read_default_file=None,
conv=None, use_unicode=None,
client_flag=0, cursorclass=<class 'pymysql.cursors.Cursor'>,
init_command=None, connect_timeout=10,
ssl=None, read_default_group=None,
compress=None, named_pipe=None,
autocommit=False, db=None, passwd=None,
local_infile=False, max_allowed_packet=16777216,
defer_connect=False, auth_plugin_map=None,
read_timeout=None, write_timeout=None,
bind_address=None, binary_prefix=False,
program_name=None, server_public_key=None
)
begin()
开始转换。
close()
commit()
cursor(cursor=None)
创建一个新的游标来执行查询。
参数:
ping(reconnect=True)
检查服务器是否处于在线状态。
参数:reconnect – 若连接关闭则自动重新连接.
抛出: Error – 如果连接关闭过着 reconnect=False.
rollback()
回滚当前事务。
请参见规范中的Connection.rollback()。
select_db(db)
show_warnings()
发送“SHOW WARNINGS” SQL命令。
class pymysql.cursors.Cursor(connection)
这是你用于与数据库进行交互的对象。不要自己创建Cursor的实例,而是调用connections.Connection.cursor()
。
方法:
callproc(procname, args=())
使用args执行存储过程procname
close()
关闭游标只会耗尽所有剩余数据。
execute(query, args=None)
执行查询
executemany(query, args)
针对一个查询运行多个数据
fetchall()
获取所有行。
fetchmany(size=None)
获取多行。
fetchone()
获取下一行。
mogrify(query, args=None)
通过调用execute()
方法返回发送到数据库的确切字符串。
此方法遵循对Psycopg的DB API 2.0的扩展
setinputsizes(*args)
什么都不做,只不过是DB API中要求的。
setoutputsizes(*args)
什么都不做,只不过是DB API中要求的。
class pymysql.cursors.SSCursor(connection)
close()
关闭游标只会耗尽所有剩余数据。fetchall()
按照MySQLdb获取所有内容。对于大型查询而言,它几乎没有用,因为它是缓冲的。如果要使用此方法的无缓冲生成器版本,请参见fetchall_unbuffered()。fetchall_unbuffered()
提取所有内容,将其实现为生成器,这不是标准的方法,但是,返回列表中的所有内容都没有意义,因为这会对大型结果集使用可笑的内存。fetchmany(size=None)
读取多行。fetchone()
读取下一行。read_next()
读取下一行。class pymysql.cursors.DictCursor(connection)
游标将结果作为字典返回。
class pymysql.cursors.SSDictCursor(connection)
无缓冲游标,将结果作为字典返回
对象关系映射(Object Relational Mapping,ORM)相当于创建了一个可在编程语言里使用的“虚拟对象数据库”,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
安装Django
pip install django
初始化一个Django项目:
django-admin startproject pro_name
进入该项目的根目录:
cd pro_name
可以看到创建了这样一个项目:
其中与根目录同名的子目录中存放了一些项目全局的参数,里面有一个settings.py
的文件,即项目的全局配置,找到并打开它:
其中有一个DATABASES
字段,它用来指定使用的数据库:
可以看到,默认使用的数据库是SQLite数据库。
你可以同时配置多个不同数据库,包括SQLite、MySQL、Qracle、Redis、MongoDB、PostgreSQL等等,并且允许同时配置多个数据库,但是一定需要有一个"default"数据库。当只配置有一个数据库时,只能是"default"。
如:
DATABASES = {
'SQLite': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
},
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'report',
'USER':'root',
'PASSWORD':'123456',
'HOST':'localhost',
'PORT':'3306',
},
'oracle': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'report',
'USER': 'guest1',
'PASSWORD': '123456',
'HOST': '192.168.191.3',
'PORT': '1521',
},
}
使用Django ORM操作MySQL时,底层也需要PyMySQL作为驱动来操作MySQL数据库。可以在项目配置文件同目录的"init.py"初始化文件中添加以下代码以使用PyMySQL作为Django ORM对MySQL的驱动:
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
进入该Django项目更目录,先创建一个 django app
,取该app的名字为“car”:
python manage.py startapp car
可以看到生成了一个名为car的目录:
打开项目的设置文件(settings.py
),将该项目名注册到 INSTALLED_APPS
字段:
进入应用“car”目录,其中有个 models.py
文件,编辑以下内容以定义数据模型:
from django.db import models
# Create your models here.
class Car(models.Model):
"""家用小车数据模型
"""
id = models.AutoField(primary_key=True)
create_time = models.DateTimeField(auto_now_add=True, verbose_name='数据创建时间')
brand_name = models.CharField(max_length=60, verbose_name='品牌')
model = models.CharField(max_length=30, verbose_name='型号')
productive_year = models.CharField(max_length=4, verbose_name='生产年份')
color = models.CharField(max_length=20, verbose_name='颜色')
price = models.IntegerField(verbose_name='价格')
现在回到项目更目录,由模型生成数据迁移文件:
python manage.py makemigrations
再执行数据迁移到数据库:
python manage.py migrate
这时可以看到我们的项目根目录下生成了一个SQLite数据库文件(后缀sqlite3
):
此时我们使用SQLite数据库管理软件(我这里使用的是SQLiteSpy,它和另一款软件sqliteadmin我已经上传到CSDN,可以点击这个链接 https://download.csdn.net/download/qq_28550263/25013485进行下载),可以看到生成了很多表,其中有一个叫做“ car_car
”的表:
该表的表名“car_car”的下划线前的字符串"car"表示我们创建的应用名为car,而下划线后一个“car”为我们在“models.py”中定义数据模型类型时,汽车数据模型类“Car”的全小写形式。
表字段 | 含义 |
---|---|
models.AutoField | 默认回生成一个名为id的字段并为int类型 |
models.CharField | 字符串类型 |
models.TextField | 长文本类型 |
models.BooleanField | 布尔类型 |
models.NullBooleanField | 允许为空的布尔类型 |
models.IntegerField | 整数类型 |
models.FloatField | 浮点数类型 |
models.DecimalField | 十进制小数类型 |
models.BigIntegerField | 长整数类型 |
models.PositiveIntegerField | 正整数的整数类型 |
models.PositiveSmallIntegerField | 小正整数类型 |
models.SmallIntegerField | 小整数类型(取值范围为:-32768~+32767) |
models.ComaSeparatedIntegerField | 用逗号分隔的整数类型 |
models.DateField | 日期类型 |
models.DateTimeField | 日期时间类型 |
models.TimeField | 时间类型,显示时分秒HH:MM[:ss[.uuuuuu]] |
models.EmailField | 字符串类型(正则表达式邮箱) |
models.IPAddressField | 字符串类型(IPv4正则表达式) |
models.GebericIPAddressField | 字符串类型(参数protocol可以是:“both”、“IPv4”、“IPv6”,验证IP地址格式正确性) |
models.URLField | 字符串类型,地址为正则表达式 |
models.SlugField | 字符串类型,包含字母、数字、下划线和连字符的字符串,常用于URL |
models.BinaryField | 二进制数据类型 |
这些Django提供的字段中,可以使用以下通用的参数:
参数 | 含义 |
---|---|
verbose_name | 在Admin站点管理设置字段的显示名称 |
related_name | 关联对象反向引用描述符,用于多表查询,可以解决一个数据表有两个外键同时指向另一个数据表而出现重名的问题 |
unique | 如果为 True ,字段将被设置为唯一值属性,默认为 False |
db_index | 如果为 True ,将为字段添加数据库索引 |
db_column | 设置数据库中的字段名称 |
primary_key | 如果为 True ,字段将被设置为主键 |
null | 如果为 True ,该字段的数值可以为空 |
blank | 如果为 True ,设置在Admin站点管理中添加数据时可允许空值 |
default | 用于设置默认值 |
OneToOneField
来构建数据表的一对一关系。ForeignKey
来构建数据表的一对多关系。ManyToManyField
来构建数据表的多对多关系。一共有以下几个步骤:
save()
方法以保存一条记录。注意:以下代码为示意的伪代码,只需根据你的实际项目修改相应名称即可。
(1)导入相应模块
from appName.models import *
(2)全表查询:select * from MyDataObj
p = MyDataObj.object.all() # 查询整个表,返回python列表
p[3].first_name # 筛选第4条数据的first_name字段
(3)表中前n条数据:select * from MyDataObj LIMIT 5
p = MyDataObj.objects.all()[:5] # 不含最后一条
(4)指定字段查询:select field_name from MyDataObj
p = MyDataObj.objects.value('field_name')
p[2]['field_name']
(5)使用values_list方法
p = MyDataObj.objects.value_list('field_name')[:3] # 获取field_name字段前3条数据
该方法返回一个QuerySet,其每条数据回呈现为一个元组进行表示。
(6)使用get方法筛选字段select * from MyDataObj where field_name = field_name_value
p = MyDataObj.objects.get(field_name = field_name_value) # 筛选某个字段满足字段值的数据
p.field_name2 # 获取其中另外一个字段的数据
(7)使用filter方法筛选字段
p = MyDataObj.objects.filter(field_name = field_name_value) # 是一个QuerySet
p[0].field_name # 赛选第一条数据的field_name字段
(8)使用filter方法可以添加多个查询条件:and逻辑
p = MyDataObj.objects.filter(field_name1 = field_name_value1, field_name2 = field_name_value2) # 是一个QuerySet
(9)使用filter方法可以添加多个查询条件:or逻辑
import django.db.models import Q
p = MyDataObj.objects.filter(
Q(field1=value1)|(field2=value2)
)
(10)去重查询
p = MyDataObj.objects.values(field_name).filter(field_name=field_value).distinct() # 返回一个QuerySet
(11)聚合查询——统计
import django.db.models import count
p = MyDataObj.objects.filter(namevalue).count()
(12)聚合查询——数据值求和
import django.db.models import Sum
p = MyDataObj.objects.values(field_name).annotate(Sum(field_value))
p.query
get
和 filter
的不同get | filter |
---|---|
查询字段必须是 主键 或者 唯一约束的字段 ,并且 查询的数据必须存在 。如果查询的字段有重复或者查询的数据不存在,程序将抛出异常信息。 | 查询的字段没有限制,只要该字段是数据表的某一存在的字段即可。 查询的结果 以列表的形式返回 如果查询结果为空(即数据库中无满足相应查询条件的数据),则返回一个空的列表。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 14:26:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |