中企动力 > 头条 > python与数据库交互

网站性能检测评分

注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。

python与数据库交互

Python数据库操作技巧 流量视频课程

img

zhni

关注

在日常的程序序开发过程中,经常要跟关系数据库打交道。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操作Mysql数据库入门——查看和增加记录 行业视频课程

img

沉沦

关注

前言

最近学了一下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前端和后端数据交互,tornado框架入门,初学小试牛刀! 互联网视频课程

img

Editha

关注

Python前端和后端是如何交互的,怎么用tornado框架快速搭建前端和后端数据交互?

前端与后端的数据交互,最常用的就是GET、POST,比较常用的用法是:提交表单数据到后端,后端返回json

前端的数据发送与接收1)提交表单数据2)提交JSON数据后端的数据接收与响应1)接收GET请求数据2)接收POST请求数据3)响应请求下面是python前端和后端数据交互的例子,利用ttornado框架快速搭建前端和后端数据交互,代:码实现如下:

import tornado.httpserverimport tornado.ioloopimport tornado.optionsimport tornado.webfrom tornado.options import define,optionsdefine('port',default=8000,help='run port', type=int)class AbcIndexHandler(tornado.web.RequestHandler):def get(self):self.write('Hello tornado')if __name__ =='__main__':tornado.options.parse_command_line()app = tornado.web.Application(handlers=[(r'/abc',AbcIndexHandler),])http_server =tornado.httpserver.HTTPServer(app)http_server.listen(options.port)tornado.ioloop.IOLoop.instance().start()在IE里输入地址加配置好的端口号,效果如下:

1、要搞懂区别,我们首先要知道他们是什么。

Web前端: 顾名思义是来做Web的前端的。我们这里所说的前端泛指Web前端,也就是在Web应用中用户可以看得见碰得着的东西。包括Web页面的结构、Web的外观视觉表现以及Web层面的交互实现。

Web后端:后端更多的是与数据库进行交互以处理相应的业务逻辑。需要考虑的是如何实现功能、数据的存取、平台的稳定性与性能等。

2、web前端分为网页设计师、网页美工、web前端开发工程师。首先网页设计师是对网页的架构、色彩以及网站的整体页面代码负责网页美工只针对UI这块的东西,比如网站是否做的漂亮,web前端开发工程师是负责交互设计的,需要和程序员进行交互设计的配合。

3、 web前端需要掌握的有脚本技术javascript p+CSS现下最流行的页面搭建技术,ajax和jquery以及简单的后端程序等。 后端的话可供开发的语言有 asp、php、jsp、.NET 这些后端开发语言的话搭建环境都不一样

4、实际的开发过程中,前端、后端开发人员的定位如下:

1)前端开发人员:精通JS,能熟练应用JQuery,懂CSS,能熟练运用这些知识,进行交互效果的开发。

2)后端开发人员:会写Java代码,会写SQL语句,能做简单的数据库设计,会Spring和iBatis,懂一些设计模式等。

python的tornado框架开发项目快速,性能比较好,今天初学框架分享的比较简单,大佬不要笑话了,欢迎留言跟小编一起学习Python和交流,祝大家早日成为Python大牛!

Python和主流数据库 推广视频课程

img

朴次茅斯

关注

关系数据库和非关系数据库

1).什么是关系数据库

关系型数据库,是指采用了关系模型来组织数据的数据库,简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。象银行系统会大量的用关系数据库.比如大家经常用的MySQL就是典型的关系数据库.

优点:

容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解

使用方便:通用的SQL语言使得操作关系型数据库非常方便

易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率

2).什么是非关系数据库

关系数据库虽然很好,但是随着互联网大规模的爆发,弱点也越来越明显,比如事务的一致性,多表联查,高并发等等瓶颈很明显。

于是NoSQL一词横空出世,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。比如MongoDb就是典型的NoSQL型数据库(键值对大家想到了什么,对json格式).

DB-API,Python DB-API为开发人员提供了数据库应用编程接口,也就是说使用它连接各数据库后,就可以用相同的方式操作各数据库。

Python Web之Django连接MySQL数据库 营销视频课程

img

晦涩

关注

前言

恭喜你,非常明智的选择了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和主流数据库 流量视频课程

img

妙菱

关注

关系数据库和非关系数据库

1).什么是关系数据库

关系型数据库,是指采用了关系模型来组织数据的数据库,简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。象银行系统会大量的用关系数据库.比如大家经常用的MySQL就是典型的关系数据库.

优点:

容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解

使用方便:通用的SQL语言使得操作关系型数据库非常方便

易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率

2).什么是非关系数据库

关系数据库虽然很好,但是随着互联网大规模的爆发,弱点也越来越明显,比如事务的一致性,多表联查,高并发等等瓶颈很明显。

于是NoSQL一词横空出世,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。比如MongoDb就是典型的NoSQL型数据库(键值对大家想到了什么,对json格式).

DB-API,Python DB-API为开发人员提供了数据库应用编程接口,也就是说使用它连接各数据库后,就可以用相同的方式操作各数据库。

Python Web之Django连接MySQL数据库 互联网视频课程

img

安筠

关注

前言

恭喜你,非常明智的选择了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框架带来的便捷吧!

img

在线咨询

建站在线咨询

img

微信咨询

扫一扫添加
动力姐姐微信

img
img

TOP