我是靠谱客的博主 爱撒娇大门,最近开发中收集的这篇文章主要介绍python资料库-Python操作三大主流数据库,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

学会使用的技术栈:python flask redis mongoDB mysql

第1章 数据库简介

简单介绍Mysql、数据库简介、导学篇

第2章 mysql基础

XAMPP 集成好的 最流行的PHP开发环境

数据库调试代码

-- 数据库链接小测试

CREATE DATABASE `mydatabase`;

USE `mydatabase`;

CREATE TABLE `students`(

`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 【解释】 id 整数类型 不为空 自动增长

`name` VARCHAR(200) NOT NULL,

`nickmane` VARCHAR(200) NULL,

`sex` CHAR(20) NULL,

`in_time` DATETIME NULL

) DEFAULT CHARACTER SET utf8 ;

-- 插入一条语句

INSERT INTO `students` VALUE(1, 'sss', 's', '1', NOW())

-- 【解释】 id 整数类型 不为空 自动增长

INSERT INTO `students` VALUE(1, '张三', '三', '男', NOW())

INSERT INTO `students` VALUE(2, '张三', '三', '男', NOW())

INSERT INTO `students` VALUE(3, '张三', '三', '男', NOW())

INSERT INTO `students` VALUE(4, 'zhangsan', 'san', 'nan', NOW())

INSERT INTO `students` VALUE(5, 'sadsadsa', 'ewqewq', 'fleman', NOW())

select * from `students`

# -- coding: utf-8 --

import MySQLdb

class MysqlSearch(object): # 让MysqlSearch类继承object对象

def __init__(self): # 在初始化的时候调用

self.get_conn()

def get_conn(self): # 数据库链接

try:

self.conn = MySQLdb.connect(

host="localhost",

user="root",

passwd="ljc123456",

db="mydatabase",

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_more(self):

sql = "select * from `students`"

cursor = self.conn.cursor()

cursor.execute(sql)

rest = cursor.fetchall()

cursor.close()

return rest

def main():

obj = MysqlSearch()

re = obj.get_more()

print(re)

print(type(re))

obj.close_conn()

pass

if __name__ == '__main__':

main()

""" 数据库链接测试成功

问题1:

OperationalError: (2006, 'SSL connection error: SSL_CTX_set_tmp_dh failed')

把 127.0.0.1 换成 localhost

import MySQLdb

MySQLdb.connect(

host="localhost",

user="root",

passwd="ljc123456",

db="mydatabase",

port=3306,

charset='utf8'

)

import pymysql

pymysql.connect(

host="localhost",

user="root",

passwd="ljc123456",

db="mydatabase",

port=3306,

charset='utf8'

)

问题2:

>

sql = "select * from `students`" 写成了 sql = "select * from `students`;"

"""

2-2 mysql图形化管理工具

Mysql语法

show databases; 查看所有数据库

use baidu;使用某一个数据库

show tables; 查看数据库的数据表

图形化的管理工具:

* Php my Admin

* Navicat for mysql

2-3 sql语法基础-创建并使用数据库

DDL 数据定义语句

* CREATE table/database 创建

* ALTER table/database 修改

* DROP table/database 删除

DML 数据管理语句

* INSERT 增加

* DELETE 删除

* UPDATE 更新

* SELECT 查询

1.创建数据库

——[注释]创建并使用数据库

CREATE DATABASE `mydatabase`; 反引号

USE `mydatabase`;

一般对数据库的操作分为 只读 和 读写

当我们在修改的时候采用读写 一般用只读来查询数据

% 代表任何ip地址都可以访问

localhost 127.0.0.1

-- 新建数据库

CREATE DATABASE `school`;

-- 使用数据库

USE `school`;

-- 创建表格

CREATE TABLE `students`(

`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 【解释】 id 整数类型 不为空 自动增长

`name` VARCHAR(200) NOT NULL,

`nickmane` VARCHAR(200) NULL,

`sex` CHAR(1) NULL,

`in_time` DATETIME NULL

);

-- 常见类型: int char varchar datetime

-- CHAR(200) 即使你存一个字符它也要用200个字节,这样很浪费空间。

-- VARCHAR(200) 以实际用的内存为主

-- NOT NULL 不为空 必须得填写

-- NULL 可以为空

-- 注意后面有一个分号 ;

-- 数据库优化:mysql36条军规

2-4 sql语法基础-创建表

2-5 sql语法基础-插入和查询语句

-- 新建查询

-- 新建多条学生数据

-- 插入语句

USE `school`;

-- 创建表格

CREATE TABLE `students6`(

`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 【解释】 id 整数类型 不为空 自动增长

`name` VARCHAR(200) CHARACTER SET utf8 NOT NULL,

`nickmane` VARCHAR(200) CHARACTER SET utf8 NULL,

`sex` CHAR(20) CHARACTER SET utf8 NULL,

`in_time` DATETIME NULL

);

CREATE TABLE `students`(

`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 【解释】 id 整数类型 不为空 自动增长

`name` VARCHAR(200) NOT NULL,

`nickmane` VARCHAR(200) NULL,

`sex` CHAR(20) NULL,

`in_time` DATETIME NULL

) DEFAULT CHARACTER SET utf8 ;

-- 显示中文要加上默认设置

-- 插入一条语句

INSERT INTO `students` VALUE(1, 'sss', 's', '1', NOW())

-- 【解释】 id 整数类型 不为空 自动增长

INSERT INTO `students` VALUE(1, '张三', '三', '男', NOW())

INSERT INTO `students` VALUE(2, '张三', '三', '男', NOW())

INSERT INTO `students` VALUE(3, '张三', '三', '男', NOW())

INSERT INTO `students` VALUE(4, 'zhangsan', 'san', 'nan', NOW())

INSERT INTO `students` VALUE(5, 'sadsadsa', 'ewqewq', 'fleman', NOW())

INSERT INTO `students5` VALUE(2, 'zhang', 'san', '0', NOW())

INSERT INTO `students6` VALUE(2, '张三', '三', '0', NOW())

INSERT INTO `students6` VALUE(1, 'ssswqewq', 'sqw', '1wew', NOW())

INSERT INTO `students6` VALUE(3, 'ssswqewq', 'sqw', '1wew', NOW())

INSERT INTO `students6` (`name`, `nickmane`, `sex`, `in_time`) VALUE('张三三多条数数据插入', '三三s', '男', NOW());

INSERT INTO `students6` (`name`, `nickmane`) VALUE('张三3', '三2s');

-- 非空的记录是必须填写的。

-- 插入多条语句

-- 以分号;结尾 表示 一个语句

-- 多行出入的时候通常以逗号,分隔。

INSERT INTO `students6` (`name`, `nickmane`) VALUES

('张三X', '三X'),

('张三X1', '三X1'),

('张三X2', '三X2'),

('张三X3', '三X3'),

('张三X4', '三X4'),

('张三X5', '三X5'),

('张三X6', '三X6')

;

/* ---- 查询语句 ---- */

-- 查询表students6的所有数据的所有信息

SELECT * from `students6`;

-- 只查询数据的`name`以及 `nickmane`

SELECT `name`, `nickmane` FROM `students6`;

-- 查询所有性别为 男 的 数据信息

SELECT `name`, `nickmane` FROM `students6` WHERE `sex`='男';

SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男';

-- 排序

-- ASC 正序、DESC 倒序

SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男' ORDER BY `id` DESC;

/*

查询条件书写的顺序

SELECT FROM

WHERE

GROUP BY

HAVING

ORDER BY

LIMIT 翻页 有两个参数 表述数据的起始位置(数据的偏移量),第二个数字表示多少个数据一页

*/

SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男' ORDER BY `id` DESC LIMIT 0, 2;

SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男' ORDER BY `id` DESC LIMIT 2, 2;

SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男' ORDER BY `id` DESC LIMIT 4, 2;

2-6 sql语法基础-修改和删除数据

/*

修改和删除数据

修改:

UPDATE 表 SET 修改的内容 WHERE 修改的哪些数据

注意:不加 WHERE 条件 就是将所有数据修改

删除:

DELETE FROM 表 WHERE 条件

注意:不加 WHERE 条件 就是将所有数据删除

*/

-- 将不是男的性别设为女

UPDATE `students6` SET `sex` = '女' WHERE `sex` != '男';

UPDATE `students6` SET `sex` = '女' WHERE `sex` IS NULL;

-- 将所有男生删除

DELETE FROM `students6` WHERE `sex` = '男';

-- 表中的数据全部删除

DELETE FROM `students6`;

2-7 设计新闻表

ID: 新闻的唯一标示

title:新闻的标题

content:新闻的内容

created_at:新闻添加的时间

types:新闻的类型

image:新闻的缩略图

author:作者

view_count:浏览量

is_valid:删除标记 新闻是否有效

删除:

物理删除:在数据库中直接将数据删除掉

逻辑删除:is_value 是否有效 ,有效1,无效0

第3章 python API

3-1 环境配置以及依赖安装

1.mysqlclient 1.3.12的支持

MySQL-5.5 through 5.7 and Python 2.7, 3.4+ are currently supported. PyPy is supported too.

lijuncheng@lijunchengdeMacBook-Pro ~ $ pip install mysqlclient

Collecting mysqlclient

Downloading mysqlclient-1.3.12.tar.gz (89kB)

100% |████████████████████████████████| 92kB 98kB/s

Building wheels for collected packages: mysqlclient

Running setup.py bdist_wheel for mysqlclient ... done

Stored in directory: /Users/lijuncheng/Library/Caches/pip/wheels/df/bb/60/bf7c315cbe163515db1c846e4ffa5557dd785c82e82f3492e8

Successfully built mysqlclient

Installing collected packages: mysqlclient

Successfully installed mysqlclient-1.3.12

2.验证是否安装成功

lijuncheng@lijunchengdeMacBook-Pro ~ $ python

Python 2.7.13 |Anaconda custom (x86_64)| (default, Sep 21 2017, 17:38:20)

[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import MySQLdb

>>>

3.python的虚拟环境 virtualenv python虚拟沙盒

多python环境

3-2 python链接mysql数据库

1.使用python连接数据库

连接到数据库之后,要关闭数据库。

3-3 python查询mysql数据库

# -- coding: utf-8 --

import MySQLdb

#中文输出. 只是为了在控制台上显示,字符的类型是正确的。

def chinese_output(str_tuple):

for i in range(len(str_tuple)):

print str_tuple[i]

pass

#将获取链接封装成calss

class MysqlSearch(object): # 让MysqlSearch类继承object对象

def __init__(self): # 在初始化的时候调用

self.get_conn()

def get_conn(self): # 数据库链接

try:

self.conn = MySQLdb.connect(

host = "127.0.0.1",

user = "root",

passwd = "admin123",

db = "news",

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_one(self): #查询一条数据

""" 流程:"""

# 1.准备SQL

sql = "SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC;"

# 2.找到cursor

cursor = self.conn.cursor()

# 3.执行SQL

cursor.execute(sql, ("本地", ))

# 这边传的参数是一个元组

# print cursor.rowcount # 一共多少行

# print cursor.description

# 4.拿到结果

# rest = cursor.fetchone() # 就查询一体哦啊结果

rest = dict(zip([k[0] for k in cursor.description], cursor.fetchone()))

# 5.处理数据

#print rest

#print rest['title']

# 6.关闭cursor链接 两个关闭

cursor.close()

self.close_conn()

return rest

def get_more(self):

sql = "SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC;"

cursor = self.conn.cursor()

cursor.execute(sql, ("本地", ))

# 多条数据获取的应该是一个list

# 列表推倒式子

rest = [dict(zip([k[0] for k in cursor.description], row))

for row in cursor.fetchall() ]

cursor.close()

self.close_conn()

return rest

# 多条数据换页

def get_more_page(self, page, page_size):

# 页面换算

offset = (page - 1) * page_size # 启始页面

sql = 'SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC LIMIT %s, %s;'

cursor = self.conn.cursor()

# 将数字转换为字符. 不用转换。 瞎忙活。

# offset_str = str(offset)

# page_size_str = str(page_size)

cursor.execute(sql, ('本地', offset, page_size, ))

# 多条数据获取的应该是一个list

# 列表推倒式子

rest = [dict(zip([k[0] for k in cursor.description], row))

for row in cursor.fetchall() ]

cursor.close()

self.close_conn()

return rest

def main():

obj = MysqlSearch()

#单个结果输出

rest = obj.get_one()

print rest['title']

#多个结果删除。list

rest_more = obj.get_more()

for item in rest_more:

print item

print '-----------------------------------------------------------------------'

#分页输出

rest_more_page = obj.get_more_page(1,1)

for item in rest_more_page:

print item

print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'

if __name__ == '__main__':

main()

3-4 python更新mysql数据

# -- coding: utf-8 --

import MySQLdb

#中文输出. 只是为了在控制台上显示,字符的类型是正确的。

def chinese_output(str_tuple):

for i in range(len(str_tuple)):

print str_tuple[i]

pass

#将获取链接封装成calss

class MysqlSearch(object): # 让MysqlSearch类继承object对象

def __init__(self): # 在初始化的时候调用

self.get_conn()

def get_conn(self): # 数据库链接

try:

self.conn = MySQLdb.connect(

host = "127.0.0.1",

user = "root",

passwd = "admin123",

db = "news",

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_one(self): #查询一条数据

""" 流程:"""

# 1.准备SQL

sql = "SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC;"

# 2.找到cursor

cursor = self.conn.cursor()

# 3.执行SQL

cursor.execute(sql, ("本地", ))

# 这边传的参数是一个元组

# print cursor.rowcount # 一共多少行

# print cursor.description

# 4.拿到结果

# rest = cursor.fetchone() # 就查询一体哦啊结果

rest = dict(zip([k[0] for k in cursor.description], cursor.fetchone()))

# 5.处理数据

#print rest

#print rest['title']

# 6.关闭cursor链接 两个关闭

cursor.close()

self.close_conn()

return rest

def get_more(self):

sql = "SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC;"

cursor = self.conn.cursor()

cursor.execute(sql, ("本地", ))

# 多条数据获取的应该是一个list

# 列表推倒式子

rest = [dict(zip([k[0] for k in cursor.description], row))

for row in cursor.fetchall() ]

cursor.close()

self.close_conn()

return rest

# 多条数据换页

def get_more_page(self, page, page_size):

# 页面换算

offset = (page - 1) * page_size # 启始页面

sql = 'SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC LIMIT %s, %s;'

cursor = self.conn.cursor()

# 将数字转换为字符. 不用转换。 瞎忙活。

# offset_str = str(offset)

# page_size_str = str(page_size)

cursor.execute(sql, ('本地', offset, page_size, ))

# 多条数据获取的应该是一个list

# 列表推倒式子

rest = [dict(zip([k[0] for k in cursor.description], row))

for row in cursor.fetchall() ]

cursor.close()

self.close_conn()

return rest

def add_one(self):

"""事务处理"""

try:

# 准备SQL

sql =(

"INSERT INTO `news` (`title`, `image`, `content`, `types`, `is_valid`) VALUE "

"( %s, %s, %s, %s, %s );"

)

# 出现换行的时候用一个元组扩起来。 应用双引号扩起来

# 获取链接和cursor

cursor = self.conn.cursor()

# 执行SQL

cursor.execute(sql, ('标题7','0122.png', '新闻内容22', '推荐', 1))

cursor.execute(sql, ('标题8','0122.png', '新闻内容22', '推荐', 'ss'))

# 错误

# 提交数据到数据库

""" 如果不提交的事务的话。就是 已经提交多数据库 但是没有被保存 """

# 提交事务

self.conn.commit()

# 关闭cursor

cursor.close()

except :

print "Error"

# self.conn.commit() # 部分提交

self.conn.rollback() # 回滚

# 关闭链接

self.close_conn()

# 多选 + / 多行注释

def main():

obj = MysqlSearch()

#单个结果输出

# rest = obj.get_one()

# print rest['title']

#多个结果删除。list

# rest_more = obj.get_more()

# for item in rest_more:

# print item

# print '-----------------------------------------------------------------------'

#分页输出

# rest_more_page = obj.get_more_page(1,1)

# for item in rest_more_page:

# print item

# print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'

obj.add_one()

if __name__ == '__main__':

main()

第4章 ORM

4-1 ORM简介

对象关系映射(Object Relational Mapping) 也就是将数据库中没一条记录变成一个对象。

ORM的实现(python ORM的框架):

1.SqlObject

2.peewee

3.Django"s ORM Django 框架

4.SQLAlchemy

doc document 文档

4-2 SQLAlchemy安装

DBAPI 对数据库的操作

SQLAlchemy 对数据库语言的封装

SQLAlchemy ORM核心的部分

1520631-20190128194750628-1610314289.png

安装:

lijuncheng@lijunchengdeMacBook-Pro ~ $ pip install SQLAlchemy

Requirement already satisfied: SQLAlchemy in ./anaconda2/lib/python2.7/site-packages

lijuncheng@lijunchengdeMacBook-Pro ~ $

测试

lijuncheng@lijunchengdeMacBook-Pro ~ $ python

Python 2.7.13 |Anaconda custom (x86_64)| (default, Sep 21 2017, 17:38:20)

[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import sqlalchemy

>>> sqlalchemy.__version__

'1.1.13'

4-3 ORM模型介绍

sql 中的数据类型和 python中 SQLAlchemy是怎么样对应的呢?

常见类型: Integer Float Boolean ForeignKe (外键) Date/DateTime String

文档:http://docs.sqlalchemy.org/en/latest/core/

一个模型对应一张表

使用命令行创建表

lijuncheng@lijunchengdeMacBook-Pro ~/Code/MySQL数据库 代码/实战网易新闻 $ python

Python 2.7.13 |Anaconda custom (x86_64)| (default, Sep 21 2017, 17:38:20)

[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> from test_mysql_orm import News

>>> from test_mysql_orm import engine

>>> News.metadata.create_all(engine) # 创建news表

/Users/lijuncheng/anaconda2/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/base.py:1569: Warning: (1287L, "'@@tx_isolation' is deprecated and will be removed in a future release. Please use '@@transaction_isolation' instead")

cursor.execute('SELECT @@tx_isolation')

>>>

4-4 新建ORM模型

ORM 链接数据库

from sqlalchemy import create_engine

engine = create_engine('mysql://root:admin123@localhost:3306/news_test?charset=utf8')

模型声明(声明的class 都是继承他)

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class需要使用到的数据类型

from sqlalchemy import Column, Integer, String, DateTime, Boolean

class News(Base):

''' 新闻类型 '''

__tablename__ = 'news'

id = Column(Integer, primary_key=True)

title = Column(String(200), nullable=False)

content = Column(String(2000), nullable=False)

types = Column(String(10), nullable=False)

image = Column(String(300))

author = Column(String(20))

view_count = Column(Integer)

created_at = Column(DateTime)

is_valid = Column(Boolean)

创建表 帮我们把些sql的工作都完成了。

News.metadata.create_all(engine)

4-5 通过ORM新增数据到数据库

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)

class OrmTest(object):

def __init__(self):

self.session = Session()

def add_one(self):

''' 添加数据 '''

new_obj = News(

title='ORM标题',

content='content',

types="百家"

)

self.session.add(new_obj)

self.session.commit()

return new_obj # 每一个条记录都是一个class

新增多条数据

session.add_all([item1, item2, item3])

4-6 通过ORM查询数据

format 格式化

def get_one(self):

""" 获取一条数据 """

return self.session.query(News).get(13) # 查询id为1的数据

测试获取一条数据

rest = obj.get_one() 判断获取的数据是不是none

if rest:

print 'ID:{0} => {1}'.format(rest.id, rest.title) # 采用format的方式格式化

else:

print "No exist."

def get_more(self):

""" 获取多条数据 """

return self.session.query(News).filter_by(is_valid = True) # 查询没有删除的 即 is_valid =1

rest = obj.get_more()

print rest.count() # 答应查询的数据条数

for row in obj.get_more():

print(row.title)

4-7 通过ORM修改删除数据

以上三节的知识点记录在代码中

# -- coding: utf-8 --

from sqlalchemy import create_engine

from sqlalchemy.orm import sessionmaker

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Table, Column, Integer, String, DateTime, Boolean

# 获取链接 Connecting

# engine = create_engine('mysql://root:admin123@localhost:3306/news_test')

# 插入中文出现错误解决

engine = create_engine('mysql://root:admin123@localhost:3306/news_test?charset=utf8')

# Declare a Mapping

# 获取基类

Base = declarative_base()

# 获取session对象

Session = sessionmaker(bind = engine)

#模型声明

class News(Base): # Base 是 ORM的一个基类 ,也就是说News类继承自Base

""" 新闻类 """

__tablename__ = 'news'

id = Column(Integer, primary_key = True) # 若数据为news_id id = Column(Interger, primaty_key = True)

title = Column(String(200), nullable = False)

content = Column(String(2000), nullable = False)

types = Column(String(10), nullable = False )

image = Column(String(300))

author = Column(String(20))

view_count = Column(Integer)

created_at = Column(DateTime)

is_valid = Column(Boolean)

"""

使用命令行创建表

lijuncheng@lijunchengdeMacBook-Pro ~/Code/MySQL数据库 代码/实战网易新闻 $ python

Python 2.7.13 |Anaconda custom (x86_64)| (default, Sep 21 2017, 17:38:20)

[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> from test_mysql_orm import News

>>> from test_mysql_orm import engine

>>> News.metadata.create_all(engine) # 创建news表

/Users/lijuncheng/anaconda2/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/base.py:1569: Warning: (1287L, "'@@tx_isolation' is deprecated and will be removed in a future release. Please use '@@transaction_isolation' instead")

cursor.execute('SELECT @@tx_isolation')

>>>

"""

class MySQLOrmTest(object):

def __init__(self):

self.session = Session()

def add_one(self):

""" 新增一条记录 """

new_obj = News(

title = '标题',

content = '内容',

types = '百家',

)

new_obj2 = News(

title = 'title ',

content = 'content ',

types = '1',

)

self.session.add(new_obj)

self.session.add(new_obj2)

self.session.commit()

return new_obj

def get_one(self):

""" 获取一条数据 """

return self.session.query(News).get(13) # 查询id为1的数据

def get_more(self):

""" 获取多条数据 """

return self.session.query(News).filter_by(is_valid = True) # 查询没有删除的 即 is_valid =1

def update_data(self, pk):

""" 修改单条数据 """

new_obj = self.session.query(News).get(pk)

if new_obj:

new_obj.is_valid = 0

self.session.add(new_obj)

self.session.commit()

return True

return False # 如果有数据就修改数据返回True,没有数据就直接返回False

def update_data_more(self):

""" 修改多条数据 """

#data_list = self.session.query(News).filter_by(is_valid = False)

data_list = self.session.query(News).filter(News.id >= 5)

for item in data_list:

item.is_valid = 1

self.session.add(item)

self.session.commit()

pass

def delete_data(self, pk):

""" 删除单条数据 """

# 获取删除的数据

new_obj = self.session.query(News).get(pk)

self.session.delete(new_obj)

self.session.commit()

def delete_data_more(self):

""" 删除多条数据 """

data_list = self.session.query(News).filter(News.id >= 5)

for item in data_list:

self.session.delete(item)

self.session.commit()

pass

def main():

obj = MySQLOrmTest()

# 测试插入一条数据

# rest = obj.add_one()

# print rest.id

# 测试获取一条数据

# rest = obj.get_one()

# if rest:

# print 'ID:{0} => {1}'.format(rest.id, rest.title) # 采用format的方式格式化

# else:

# print "No exist."

# 测试获取多条数据

# rest = obj.get_more()

# print rest.count() # 答应查询的数据条数

# for new_obj in rest:

# print 'ID:{0} => {1}'.format(new_obj.id, new_obj.title)

# pass

# 测试修改数据代码

# print obj.update_data(10)

# # 测试多条数据修改代码

# obj.update_data_more()

# 测试删除数据代码

# obj.delete_data(1)

# 测试删除多条数据代码

obj.delete_data_more()

if __name__ == '__main__':

main()

"""

将每一条记录看成一个对象,ORM就是把数据库的记录转换为对象。

ORM的实现:

1.SqlObject

2.peewee

3.Django"s ORM Django框架

4.SQLAlchemy

"""

第五章 网易新闻实战

5-1 项目概述

fask框架 web网页

flask + SQLAlchemy

flask 里面有一个微小的服务器,供我们调试使用。

但是部署到服务器上不会用这个做,我们会用其他方式来做。

因为它的并发,负载可定是不够的,只能满足开发的需求!

部署服务器:tomcat 或者 ngix

test_flask.py

# -- coding: utf-8 --

from flask import Flask

app = Flask(__name__) # 构造出一个app对象

@app.route('/helle') # 通过app路由 装饰器 用户访问到指定地址

def hello_world(): # 然后把这个地址定义到一个方法中进行处理就好了。

return 'Hello World helle !'

"""

flask 里面有一个微小的服务器,供我们调试使用。

但是部署到服务器上不会用这个做,我们会用其他方式来做。

因为它的并发,负载可定是不够的,只能满足开发的需求!

"""

if __name__ == '__main__':

app.run(debug = True) # 用debug调试方式打开 按 cmd+s 保存的时候,服务器会自动重新启动。 将app运行起来。

当写的网页找不到的适合,看看网址是不是有问题,例如出现在这样的问题 :@app.route('/helle')

5-3 网页新闻框架搭建

项目截图

1520631-20190129145704494-1188840801.png

项目介绍:

static 存放静态文件 JS JQuery CSS的图片

templates 用来放模板文件

模板文件继承其他模板文件

flask_new.py flask程序,里面调用forms表单

forms.py forms表单

Bootstrap 在手机、 pc端 都有很好的展示效果 自适应调整 http://v3.bootcss.com/css/

Utf8 字符

Utf8mb4 中文字符+微信表情

utf8mb4_general_ci

错误:

1.unexpected indent 字符对其

2.ImportError: No module named sqlalchemy

html也是有模版文件的

Bootstrap 中小型企业的模版

1

app = Flask(__name__)

# 配置数据库

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:ljc123456@localhost/mydatabase'

# flaskSQLAlchemy

db = SQLAlchemy(app)

2

# 继承的类 db = SSQLAlchemy(app)

class News(db.Model):

""" 新闻模型 """

__tablename__ = 'news'

id = db.Column(db.Integer, primary_key=True)

title = db.Column(db.String(200), nullable=False)

content = db.Column(db.String(2000), nullable=False)

types = db.Column(db.Enum('推荐', '百家', '本地', '图片'))

image = db.Column(db.String(200), nullable=False)

author = db.Column(db.String(20))

view_count = db.Column(db.Integer)

created_at = db.Column(db.DateTime)

is_valid = db.Column(db.Boolean, default=True)

# print class对象的时候返回的是数据(新闻标题)、而不是地址。

def __repr__(self):

return '' % self.title

session不用声明flask已经全部封装好了。

>>> from flask_news import db

/Users/lijuncheng/anaconda2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.

'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '

>>> db.create_all()

>>> db.create_all()

/Users/lijuncheng/anaconda2/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/base.py:1569: Warning: '@@tx_isolation' is deprecated and will be removed in a future release. Please use '@@transaction_isolation' instead

cursor.execute('SELECT @@tx_isolation’)

插入数据

>>> from flask_news import News

>>> new_obj = News(

title = '标题',

content = '内容',

types = '百家',

)

... ... ... ... >>>

>>> db.session.add(new_obj)

>>> db.session.commit()

查询数据

>>> News.query.all()

[]

5-4 网易新闻前台

给网页配置路由 也就是html文件。

5-5 网易新闻后台管理首页及分页

区别

query.filter_by flter_by 可以使用 python 的正常参数传递方法传递条件,指定列名时,不需要额外指定类名。

query.filter filter 可以像写 sql 的 where 条件那样写 > < 等条件,但引用列名时,需要通过 类名.属性名 的方式。

query.get 一般都是去找主建

filter_by: 用于查询简单的列名,不支持比较运算符

filter比filter_by的功能更强大,支持比较运算符,支持or_、in_等语法

5-6 网页新闻数据增加

flask-wtf 制作表单

安装:pip install Flask-WTF

5-7 网易新闻数据修改

5-8 网页新闻数据删除

通过异部进行删除,先请求再删除

整理要用的jquery的知识来使用ajax处理事件

1520631-20190130112042752-568412068.png

后面还要学习一些知识

第6章 MongoDB 数据库基础

6-1 mongoDb基础知识 (07:35)

1520631-20190130121046089-120866096.png

1520631-20190130121159781-1211461071.png

1520631-20190130121243312-2098271993.png

1520631-20190130121221854-930653867.png

1520631-20190130121528135-857084054.png

6-2 mongoDb安装和配置 (05:44)

用homebrew下载安装

启动:mongod

新建数据文件存放地址

1520631-20190130123057891-884246353.png

启动mongodb数据库

1520631-20190130123146392-2005817593.png

6-3 使用命令行操作数据库 (13:32)

6-4 练习 (13:14)

1520631-20190130122309903-1788093287.png

6-5 图形化管理工具 (04:33)

第7章 Python操作MongoDB

7-1 pymongo介绍和安装 (03:18)

7-2 使用python连接数据库 (09:08)

7-3 使用python新增数据到mongodb (07:53)

7-4 使用python查询数据 (08:02)

7-5 使用python修改数据 (06:01)

7-6 使用python删除数据 (04:45)

第8章 MongoDB ODM(1)

8-1 MongoEngine的安装及连接 (06:00)

8-2 ODM模型介绍 (11:46)

第9章 MongoDB ODM(2)

9-1 通过ODM查询数据 (12:02)

9-2 通过ODM修改和删除数据 (09:03)

9-3 通过ODM新增数据 (09:54)

第10章 MongoDB 网易新闻实战

10-1 实战项目简介及依赖安装 (04:10)

10-2 新闻前台 (20:46)

10-3 新闻后台首页及分页 (07:12)

10-4 新闻数据的新增 (07:55)

10-5 新闻数据的修改 (05:12)

10-6 新闻数据的删除 (04:54)

第11章 Redis数据库基础

11-1 Redis介绍 (02:29)

11-2 -Redis的安装 (03:30)

11-3 -Sting类型相关操作 (09:22)

11-4 -List 类型数据相关操作 (09:08)

11-5 -Set类型相关操作 (04:53)

11-6 -Hash类型相关操作 (08:10)

11-7 -图形化管理工具 (04:30)

第12章 python操作redis

12-1 redis-py的安装和连接 (05:10)

12-2 Python操作String类型相关命令 (09:22)

12-3 Python操作List类型相关命令 (07:48)

12-4 Python操作Set类型相关命令 (09:00)

12-5 Python操作Hash类型相关命令 (08:33)

第13章 python操作resis网易新闻实战

13-1 实战项目介绍及分析 (05:23)

13-2 实现新闻数据的新增 (13:35)

13-3 新闻数据新增事务支持 (07:40)

13-4 新闻数据首页 (10:50)

13-5 新闻类别页和详情页 (08:20)

13-6 后台首页及分页 (13:54)

13-7 新闻数据的修改 (06:07)

13-8 新闻数据的删除 (10:47)

最后

以上就是爱撒娇大门为你收集整理的python资料库-Python操作三大主流数据库的全部内容,希望文章能够帮你解决python资料库-Python操作三大主流数据库所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部