网站性能检测评分
注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
python做数据库
「技术文章」《Python 数据库 GUI CGI编程》 推广视频课程
1.写在前边
上一次,我们介绍了Python的入门的文章,今天我们就来介绍下Python的数据库,GUI, CGI的编程,以及Python 2.x 与Python 3.x的区别。
2.连接数据库
Python 标准数据库接口为 Python DB-API,MySQLdb 是用于Python链接Mysql数据库的接口。使用的时候,必须安装MySQLdb 模块,否则会报出来模块找不到。
2.1 Linux下安装MySQLdb模块
使用包安装可以 wget http://sourceforge/projects/mysql-python/files/latest/download
$ tar xfz MySQL-python-1.2.3.tar.gz$ cd MySQL-python-1.2.3$whereis mysql_config mysql_config: /usr/bin/mysql_config$ vim site.cfg 修改mysql_config为mysql配置文件的路径 /usr/bin/mysql_config 还要修改 threadsafe = False$ python setup.py build$ sudo python setup.py install
2.2 mac下安装MySQLdb模块
使用easy_install pip命令安装pip
$ easy_install pip
mac安装pip$ pip install MySQL-Python
2.3 查询数据库
代码在GitHub上的源码地址:http://t/RQjcvfl
数据库的输出效果3. GUI编程
Python 提供了多个图形开发界面的库,其中Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。
代码在GitHub上的源码地址:http://t/RQjcvfl
Python的GUI编程mac系统下GUI的效果4. CGI编程
1)Python的CGIHTTPServer一般是与python一起安装的,使用如下命令既可以启动,为了便于组织目录,建议先建立一个目录,比如web,然后再运行下面的命令。
nohup python -m CGIHTTPServer 8088 &
原理图2)静态文件代码地址:http://t/R8wMYHr
前端html代码访问地址:http://localhost:8088/
前端图3)提交给后端的地址是 http://localhost:8088/cgi-bin/c_area.sh
后端shell代码后端的shell脚本地址:http://t/R8wMmMn
提交后计算结果5. Python 2.x 与 Python 3.x区别
5.1 两者不兼容
Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。
为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容。
许多针对早期Python版本设计的程式都无法在Python 3.0上正常执行。
为了照顾现有程序,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。
5.2 一图胜千言
Python2与Python3区别可以升级的自己的python版本,建议直接采用Python3,毕竟是趋势。使用 “2to3工具”也是不错的选择。
6. 写在最后
本文简单接受了Python的数据库链接,GUI, CUI的简单编程,最后简单介绍了Python2 与Python3的区别,欢迎大家交流。
有前途的Python一个小白的转行自学Python的经历 行业视频课程
想动手写写自己的经历,希望对更多的像我一样想转行自学的年轻人的一些帮助。和一些鼓励吧。
1. 为什么想换工作
我的大概情况是,本科专业建筑环境与设备工程,16年7月毕业,同学很多去了工地。我的话,受不了工地居无定所,去了制造业。
制造业确实环境不好,虽然我的岗位是研发工程师,但是经常要在车间干体力活车间,累的满头大汗,跟车间的大妈大叔撕逼。
不管是自然环境还是人文环境,只能用恶劣来形容吧。而且我们是单休,动不动就加班,最扯淡的是加班是没有钱的。但凡节假日一般放一天,国企两天,搞笑的是周日值班一天,给32块钱。
看到我们办公室里面三十几岁的男生还没有女朋友,还有即使有女朋友的还在住员工宿舍,而且有的快十年的工作经验,还出国待过,现在月薪不到1w。
想到七八年以后我的生活是这样,我就惶恐不安,我觉得我七八年后不要过这样的生活。
于是决心转行,瞄准IT行业。理由很简单,从业环境好,工作内容没有体力活(ps:相对于体力劳动,我更喜欢脑力劳动),相同的努力下,钱比制造业多,而且现在各个行业都与互联网相关。
2. 如何提前准备
从去年也就是11月开始自学数据分析的一些课程。当时由于没有计算机基础,走了不少弯路,看了一些教程,东拼西凑,感觉乱七八糟。
甚至有一段时间,我不断怀疑自己,放弃大学四年的知识,现在不做传统行业的研发,转身去接触一个新的东西是不是对的?
那段时间,我认识了一些数据分析岗位的在职者,年龄不大。有个同学就建议我先做python开发,再做数据分析,(因为他说数据分析如何如何难,机器学习算法都是大牛玩儿的)我当时犹豫了很久,还自学了Django教程,前端知识,http协议,去熟悉Linux。准备去找python开发的职位(其实我对软件开发不感冒)。
后来,我在“得到” 上看了两篇文章,至今对我很有启发。
第一篇文章《转行》说了以下重点:
1. 寻找一个导师导师可以降低你加入一个新行业的成本,帮助你熟悉环境和行业规则,也会鼓励你完成心理方面的转变。2. 建立新的社交网络过去的人脉关系会阻碍你的转行,因为他们是以过去对你的认知来评价你。新领域的人脉,会给你提供各种各样新的机会和情感支持,帮助你融入。
第二篇文章《职场人终身学习心法》归纳下:
首先,如果想系统地学习,那就建议选择系统的渠道。既然在这个领域你是新手,就不要指望自己能把散落的信息整合成系统了,那是高手要做的事情。要想系统地学习,那就踏踏实实地拿出几个月的时间来,看5本这个领域的经典书,选一门系统课,或者跟着一个系统学习过的老师把这个领域的骨架摸清楚。你又不比别人聪明几倍,却想用几分之一的时间,就掌握人家花了好长时间下了硬功夫,系统掌握的知识,怎么可能呢?先接受一个已经存在的系统,再在上面修修改改,对于新手是最适合的方案。
用3句话来总结一下上面两篇文章:
1. 转行最好有人带、有人指导2. 去认识做大数据这块的人,否则身边的人脉关系会不断否定你,打击你(以及要说服女朋友支持你折腾,如果有的话!)3.系统学习,要几个月,不要贪多,要扎扎实实看书
这样一看,我就明白多了,并且知道该怎么做了。
第一的话,我想转行做数据分析这块的,我过去的背景与此相差太远。现在的话,我只有坚持终身学习,系统学习,要看书,好好啃。
第二的话,你可以加我扣扣一六二二中间四七九最后四三五一起学习,分享我的视频资料给你,不失为一个明智的选择。
当然,上面的建议是建立在你下决心要转行的基础上。先问问自己下面几个问题:
喜欢不喜欢转行后的工作?评估自己转行的优势与劣势?问问自己为什么不待在现在的行业了?自己是不是有很强的自我驱动力?自己是不是能保持终身学习?自己搜集信息和整合信息的能力是不是很强?自己是不是不怕失败?转行失败了,我拿什么保底?
把这些令人焦虑和令人害怕的事情考虑清楚,再去做决定,我要不要转行。这些问题你想清楚了,就清除了学习的道路上的精神障碍。
学习的那段时间,我基本上学习每天3-5小时。我们是单休,周日的话,我陪着女友。(此处撒了狗粮)。其实每个星期也就平均30小时左右。加上在办公室没有事情的情况下,我给工作的电脑装了某些软件,看看东西,用有道云笔记记录。
基本上,这几个月,先后看了《python核心编程》《利用python进行数据分析》《R语言实战》 ,还看了SQL的一些教程,以及一些数据分析师需要的思维。最后面试的时候,掌握的技能,SQL,python,R。会一点简单的爬虫,懂点Linux。
但是但是,每一个我都掌握的很浅,书我都只看了一半。像一些复杂的算法,我还不能深入的理解。
3. 我是这样辞职面试的
自己2月28号辞职流程走完,是直接裸辞了,当时很多人劝我不要冲动,不要裸辞,没想到辞职以后整个神清气爽。
我自己认为不能等完全学好了再去找,到那时候黄花菜都凉了,毕竟世上的事情都没有那么多时间让你去准备好的,而且17届的马上也毕业出来了,到时候再去会更加尴尬。
辞职以后,3月5号来到深圳。密集的面试维持了两周,几乎天天出去面试,还有就是面试的时候,会被打脸的,问一些技术细节,以及没有工作经验。我是很直接就告诉面试官,我就是要转行的,我没有这块的工作经验。
面试主要是两块,一块是考察你的思维,还有一块是考察你的技术细节。期间面试的比较有名的公司有平安银行,ofo,链家网。拿了3个offer。但是其他两个都是大小周加班,我都没有选择。现在的公司是做互联网金融的。
4. 转行后的我是这样的
我之前在制造业,现在出来找工作,特别在意是不是双休,五险一金有没有给我交全(之前公司是没有一金的),节假日是不是正常放假。
现在的话,这个公司制度是,不鼓励员工加班,基本一下班,办公室人几乎走光。我自己也走啦,回来以后继续学习。
每天对着电脑上班,确实比之前的工作累好多。但是还是感觉比之前工作状态好太多。
还有就是未来的领导很重要,我面试时候都会跟领导聊聊,看看领导人咋样,问问公司氛围咋样,这样对自己进入以后就非常有益。
待遇这块是比以前的工作好一些的。考虑到还要在深圳租房子,每个月剩不了多少。但是每天下班回来自己煮饭,吃的很饱,就很开心。周末的话,和女友在一起煮饭。这个周末我俩煮了鸡汤。
自己的话也知道自己水平,虽然已经入职了,但是像自己很菜鸟的,老大让我用python连个数据库,我连了一下午才搞定。还让我用python写个excel数据透视的自动化报表,憋了一天了,我的代码还没出来。现在来看,转行也只是进行了一半,因为后面还要继续学的很多啊。
新公司用的SAS,我现在又开始看SAS了。老大也一直跟我强调,工具只是用来解决问题的,如果你有更好的办法就去尝试,数据分析思维是很重要的。不过我的老大,人非常好,也愿意教我。
后面的路还很长,希望自己一直坚持,一直加油。做一个终身学习者。
关于转行的话,确实很难,可能会交不起房租,像我现在就是穷的一塌糊涂,不过幸好有个女朋友哈哈,没钱了问她要。而且影响因素是多方面的,希望各位要转行的宝宝一定要慎重,想清楚。其次,就是一定要坚持学习,不要怀疑自己,状态要好。
下面这个是以前的工作环境。办公室在旁边的小房子里面。
下面是新公司的办公环境,瞬间觉得转行后生活很美好。没在制造业和工地待过的人是无法体会这种改变的,自然环境和人文环境简直是质的飞跃啊。
转行以后的生活
生活在于等待。有时候幸福可能会晚点到来, 未来越来越好,用知识赚钱,我们一路同行,你并不孤单。
欢迎评论!!!!
一起交流!!!!
一起学习!!!!
Python数据库操作技巧 流量视频课程
在日常的程序序开发过程中,经常要跟关系数据库打交道。python异步连接数据库用aiomysql,笔者就在使用此库过程中的一些心得和技巧记录如下。
我们先看一下同步数据库连接方法,PyMySQL官方给的使用方法如下:
在日常使用过程序中,如果均采用这样的方法来操作数据库,代码的编写量很大,而且容易出错,现就异步程序数据库连接解决办法归纳如下,如果是同步程序,就可以依据异步程序相应做修改即可,思路是一模一样的:
创建连接池
我们需要创建一个全局的连接池,每个HTTP请求都可以从连接池中直接获取数据库连接。使用连接池的好处是不必频繁地打开和关闭数据库连接,而是能复用就尽量复用。缺省情况下将编码设置为utf8,自动提交事务:
import logging
import aiomysql #这是异步操作pymysql的库
DATABASES = { 'host':'127.0.0.1',
'port':3306,
'user':'root',
'password':'',
'db':'mydb',
'charset':'utf8mb4',
# 'cursorclass':pymysql.cursors.DictCursor }
async def create_pool(loop, **kw):
"""定义mysql全局连接池"""
logging.info('create database connection pool...')
global _mysql_pool
_mysql_pool = await aiomysql.create_pool(host=DATABASES['host'], port=DATABASES['port'], user=DATABASES['user'],
password=DATABASES['password'], db=DATABASES['db'], loop=loop,
charset=kw.get('charset', 'utf8'), autocommit=kw.get('autocommit', True),
maxsize=kw.get('maxsize', 10), minsize=kw.get('minsize', 1))
return _mysql_pool
封装增删改查
访问数据库需要创建数据库连接、游标对象,然后执行SQL语句,最后处理异常,清理资源。这些访问数据库的代码如果分散到各个函数中,势必无法维护,也不利于代码复用。所以,我们要首先把常用的SELECT、INSERT、UPDATE和DELETE操作用函数封装起来。由于Web框架使用了基于asyncio的aiohttp,这是基于协程的异步模型。在协程中,不能调用普通的同步IO操作,因为所有用户都是由一个线程服务的,协程的执行速度必须非常快,才能处理大量用户的请求。而耗时的IO操作不能在协程中以同步的方式调用,否则,等待一个IO操作时,系统无法响应任何其他用户。这就是异步编程的一个原则:一旦决定使用异步,则系统每一层都必须是异步,“开弓没有回头箭”。幸运的是 aiomysql 为MySQL数据库提供了异步IO的驱动。
1. 要执行SELECT语句,我们用select函数执行,需要传入SQL语句和SQL参数:
async def fetchone(sql, args=(), size=None):
"""封装select,查询单个,返回数据为字典"""
log(sql, args)
async with _mysql_pool.acquire() as conn:
async with conn.cursor(aiomysql.DictCursor) as cur:
await cur.execute(sql, args)
result = await cur.fetchone()
return result
async def select(sql, args=(), size=None):
"""封装select,查询多个,返回数据为列表"""
log(sql, args)
async with _mysql_pool.acquire() as conn:
async with conn.cursor(aiomysql.DictCursor) as cur:
await cur.execute(sql, args)
if size:
result = await cur.fetchmany(size)
else:
result = await cur.fetchall()
logging.info('rows returned: %s' % len(result))
return result
注意要始终坚持使用带参数的SQL,而不是自己拼接SQL字符串,这样可以防止SQL注入攻击。如果传入size参数,就通过fetchmany()获取最多指定数量的记录,否则,通过fetchall()获取所有记录。
2. 封装Insert, Update, Delete
要执行INSERT、UPDATE、DELETE语句,可以定义一个通用的execute()函数,因为这3种SQL的执行都需要相同的参数,以及返回一个整数表示影响的行数:
async def execute(sql, args=()):
"""封装insert, delete, update"""
log(sql, args)
async with _mysql_pool.acquire() as conn:
async with conn.cursor() as cur:
try:
await cur.execute(sql, args)
except BaseException:
await conn.rollback()
return
else:
affected = cur.rowcount
return affected
execute()函数和select()函数所不同的是,cursor对象不返回结果集,而是通过rowcount返回结果数。
Python Web之Django连接MySQL数据库 推广视频课程
前言
恭喜你,非常明智的选择了Django作为你项目开发的基础框架(手动滑稽)!
1.1.Django项目连接mysql数据库
Django项目要操作数据库,首先要和数据库建立连接,才能让程序中的数据和数据库关联起来进行增删改查操作。
Django项目默认使用mysqldb模块进行和mysql数据库之间的交互操作,但是mysqldb模块对于python3.4以上的版本支持还不够完善,所以我们要使用替代方案。
通过pymysql模块完成和数据库之间的交互过程
Django连接mysql数据库的操作,是通过根模块的配置实现的,在项目根模块的配置文件settings.py中,我们可以查询到如下DATABASES的配置信息:
settings.py配置文件
ENGINE:用于特定的数据库引擎的配置,一般如下几种:
django.db.backends.sqlite3django.db.backends.postgresqldjango.db.backends.mysqldjango.db.backends.oracle
其余的参数分别是:
NAME:要连接的数据库名称的配置;
USER:配置连接数据库的用户账号;
PASSWORD:配置连接数据库的登录密码;
HOST:配置数据库所在的主机IP地址;
PORT:配置连接数据库的端口号;
CHARSET:配置连接数据库交互数据编码格式。
如图:
修改DATABASES配置
如此,Django和数据库之间的连接关系就建立了。
1.2.定义创建模型
在Django项目中定义模型数据,其实就是定义class类型,通过类型创建的对象来封装管理数据,一定要在这里明确关联和对应关系。
定义创建模型
有了对应关系之后,我们要创建的模型对象的属性必须和数据库中的字段类型对应起来:
对应关系
每个字段定义时,都会有自己的一些特殊的选项指定:
主键和唯一约束等
在大部分项目中,还会涉及到多表关联操作:
多表关联操作
根据创建的个人博客,创建用户类型和文章类型如下:
mysite/myblog/views.py
创建文章类型和作者类型
2.数据库同步操作
创建好我们需要的模型类之后,需要将创建好的类型添加到数据库中并同时建立关联关系,根据模型类自动生成对应数据库引擎的sql语句。在settings.py中,连接数据库信息中配置了数据库引擎,其实就是已经告诉Django我们使用的是哪个数据库了,Django会根据指定的数据库自动生成sql语句。
python manage.py makemigrations
自动创建指定数据库的sql语句
查看生成的sql语句
通过命令自动生成sql语句之后是存储在文件中的,我们可以通过命令的方式直接查看生成的sql语句:
例:python manage.py sqlmigrate myblog 0001
自动同步到数据库
既然Django可以自动生成sql语句,当然可以自动同步到数据库中,并不需要开发人员再去手工创建各种数据表了:
例:python manage.py migrate
同步数据库命令
此时,再查看你的数据库,好好享受Django框架带来的便捷吧!
Python操作Mysql数据库入门——查看和增加记录 公司视频课程
前言
最近学了一下sql,因为做数据分析不会sql真不行。
平时学的都是Python,所以如果要用pandas做数据分析,数据除了导入excel和csv文件,
应该还要会从数据库中导入数据到Python中,于是我进行了以下的学习和探索。
环境
Python 3.X
IDE : juyter notebook
安装必要的模块
进入:
http://lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
找到适合自己的版本
下载到本地(我的下载到e:盘根目录)
然后打开cmd如下图安装
这里推荐本地安装
使用Python连接数据库
import MySQLdb
如果导入模块没报错,恭喜你,安装模块成功了!
conn = MySQLdb.connect( host = '127.0.0.1',#本地地址 user = 'root',#一般默认用户名 passwd = '********',#本地数据库登录密码 db = 'test',#数据库名称 port = 3306,#安装mysql默认的端口号 charset = 'utf8'#设置数据库统一编码)
通过connect方法连接本地mysql数据库,这里要注意你要修改的或许是登录密码和数据库名称
创建游标
首先,我们要创建一个游标
cursor = conn.cursor()
什么是游标呢?
游标就相当于一个缓冲区,存放暂时的结果(这是我的理解)
就像去超市买买买,你可能要推一个手推车,这里的手推车就像游标,推着手推车去对应的货架完成挑选操作,而手推车最终会在出超市时候清空
观察数据库
我本地的数据库test中有个tdb_goods的表
表的内容如上图所示
有商品的id,名称,种类id,品牌id,是否在售和是否下架几个字段
一共有23条记录
获取数据
我们使用select语句可以获取数据
cursor.execute('SELECT * FROM `tdb_goods`;')data = cursor.fetchone()#取一条数据print(data)
首先我们用游标的execute方法执行一句sql语句获取tdb_goods中的所有数据
然后使用游标的fetchone方法取出其中一条记录并且展现出来
如上图,我们取出的数据是元组形式
当然,我们应该养成打开后关闭的好习惯,所以,在操作结束,应该断开与数据库的连接
conn.close()
异常处理
当我们在操作时,希望和在mysql数据库中一样,异常时会提示异常信息
那么我们就要加入异常处理模块
try: conn = MySQLdb.connect( host = '127.0.0.2222', user = 'root', passwd = '********', db = 'test', port = 3306, charset = 'utf8' )except MySQLdb.Error as e: print('Error:%s' % e)
这里异常时,就将异常的信息告知我们了
我们将以上代码整理一下:
import MySQLdbtry: conn = MySQLdb.connect( host = '127.0.0.1', user = 'root', passwd = '********', db = 'test', port = 3306, charset = 'utf8' ) cursor = conn.cursor() cursor.execute('SELECT * FROM `tdb_goods`;') data = cursor.fetchone() print(data) conn.close()except MySQLdb.Error as e: print('Error:%s' % e)
当我们将fetchone改成fetchall时候,就是取出所有信息了
使用面向对象编程
如果你熟悉面向对象编程或者看过我写的面向对象编程入门系列(小姐姐系列)
传送门:
Python面向对象编程从零开始(1)——从没对象到有对象
Python面向对象编程从零开始(2)—— 与对象相互了解
Python面向对象编程从零开始(3)—— 小姐姐请客上篇
Python面向对象编程从零开始(4)—— 小姐姐请客下篇
Python面向对象编程从零开始(5)—— 小姐姐要买房
如果你还没接触过面向对象编程,看完以上5篇至少对接下来的内容理解上不存在问题
import MySQLdbclass Mysql(object): def __init__(self): self.connect() def connect(self): try: self.conn = MySQLdb.connect( host = '127.0.0.1', user = 'root', passwd = '********', db = 'test', port = 3306, charset = 'utf8' ) except MySQLdb.Error as e: print('Error:%s' % e) def close_conn(self): try: if self.conn: self.conn.close() except MySQLdb.Error as e: print('Error:%s' % e) def get_a(self): sql = 'select * from `tdb_goods` where `cate_id` = %s;' cursor = self.conn.cursor() cursor.execute(sql,('1',)) data = cursor.fetchone() print(data) cursor.close() self.close_conn() def main(): object = Mysql() object.get_a() if __name__ == '__main__': main()
注:这里定义了一个类叫Mysql,然后用类创建一个对象名为object,在创建对象的时候,类的初始化时调用连接数据库函数
创建了一个叫object的对象,使用对象的get_a方法从数据库tdb_goods中选出cate_id=1的一条记录,在get_a函数最后位置断开数据库连接
结果如下:
插入记录到数据库
import MySQLdbclass Mysql(object): def __init__(self): self.connect() def connect(self): try: self.conn = MySQLdb.connect( host = '127.0.0.1', user = 'root', passwd = '********', db = 'test', port = 3306, charset = 'utf8' ) except MySQLdb.Error as e: print('Error:%s' % e) def close_conn(self): try: if self.conn: self.conn.close() except MySQLdb.Error as e: print('Error:%s' % e) def get_a(self): sql = 'select * from `tdb_goods` where `cate_id` = %s;' cursor = self.conn.cursor() cursor.execute(sql,('1',)) data = cursor.fetchone() print(data) cursor.close() self.close_conn() def add_a(self): sql = "insert into `tdb_goods`(`goods_name`,`cate_id`,`brand_id`,`goods_price`,`is_show`,`is_saleoff`) value (%s,%s,%s,%s,%s,%s);" cursor = self.conn.cursor() cursor.execute(sql,('伟哥牌notebook','8','1','66666','1','0')) cursor.close() self.close_conn() def main(): object = Mysql() object.add_a() if __name__ == '__main__': main()
注:这里,将一条记录插入了数据库,但是当我执行完这条语句(没报错)
刷新数据库并没有新增一条记录
划重点:在这里,有一个self.connmit(),这个叫提交,如果不写这句,就无法将所做修改保存的数据库中
加上这个之后(加在以下两句之间):
可以看到,数据成功写入数据库了~
如果运行代码报错,很可能是你的数据库名和数据库登录密码没有修改~
文中如有错误和叙述不妥之处,望指正。
Python和主流数据库 公司视频课程
关系数据库和非关系数据库
1).什么是关系数据库
关系型数据库,是指采用了关系模型来组织数据的数据库,简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。象银行系统会大量的用关系数据库.比如大家经常用的MySQL就是典型的关系数据库.
优点:
容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解
使用方便:通用的SQL语言使得操作关系型数据库非常方便
易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率
2).什么是非关系数据库
关系数据库虽然很好,但是随着互联网大规模的爆发,弱点也越来越明显,比如事务的一致性,多表联查,高并发等等瓶颈很明显。
于是NoSQL一词横空出世,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。比如MongoDb就是典型的NoSQL型数据库(键值对大家想到了什么,对json格式).
DB-API,Python DB-API为开发人员提供了数据库应用编程接口,也就是说使用它连接各数据库后,就可以用相同的方式操作各数据库。