- 網址:https://coding.imooc.com/learn/list/114.html
- 學會使用的技術棧:python flask redis mongoDB mysql
第1章 數據庫簡介
簡單介紹Mysql、數據庫簡介、導學篇
第2章 mysql基礎
XAMPP 集成好的 最流行的PHP開發環境
mac 版本的mysql 安裝
https://www.cnblogs.com/myxq666/p/7787744.html
數據庫調試代碼
-- 數據庫鏈接小測試
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:
<bound method MysqlSearch.get_more of <__main__.MysqlSearch object at 0x107922390>>
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安裝
官方文檔:https://docs.sqlalchemy.org/en/latest/core/tutorial.html
DBAPI 對數據庫的操作
SQLAlchemy 對數據庫語言的封裝
SQLAlchemy ORM核心的部分

安裝:
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英文文檔:http://flask.pocoo.org/docs/0.11/
flask中文文檔:http://docs.jinkan.org/docs/flask/
Flask-SQLAlchemy:http://flask-sqlalchemy.pocoo.org/2.1/
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 網頁新聞框架搭建
項目截圖

項目介紹:
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 '<News %r>' % 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()
[<User u'\u6807\u9898'>]
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處理事件

后面還要學習一些知識
第6章 MongoDB 數據庫基礎
6-1 mongoDb基礎知識 (07:35)
6-2 mongoDb安裝和配置 (05:44)
用homebrew下載安裝
啟動:mongod
- 新建數據文件存放地址

- 啟動mongodb數據庫

6-3 使用命令行操作數據庫 (13:32)
6-4 練習 (13:14)

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網易新聞實戰
