簡單介紹Mysql、數據庫簡介、導學篇css
XAMPP 集成好的 最流行的PHP開發環境html
mac 版本的mysql 安裝
https://www.cnblogs.com/myxq666/p/7787744.htmlpython
數據庫調試代碼mysql
-- 數據庫連接小測試 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圖形化管理工具jquery
圖形化的管理工具:
* Php my Admin
* Navicat for mysql
2-3 sql語法基礎-建立並使用數據庫web
DML 數據管理語句
* INSERT 增長
* DELETE 刪除
* UPDATE 更新
* SELECT 查詢
1.建立數據庫ajax
——[註釋]建立並使用數據庫 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語法基礎-建立表redis
2-5 sql語法基礎-插入和查詢語句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語法基礎-修改和刪除數據mongodb
/* 修改和刪除數據 修改: 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-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()
對象關係映射(Object Relational Mapping) 也就是將數據庫中沒一條記錄變成一個對象。
ORM的實現(python ORM的框架):
1.SqlObject
2.peewee
3.Django‘s ORM Django 框架
4.SQLAlchemy
doc document 文檔
官方文檔: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'
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') >>>
from sqlalchemy import create_engine engine = create_engine('mysql://root:admin123@localhost:3306/news_test?charset=utf8')
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base()
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)
News.metadata.create_all(engine)
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])
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)
以上三節的知識點記錄在代碼中
# -- 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 """
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')
項目截圖
項目介紹:
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 中小型企業的模版
app = Flask(__name__) # 配置數據庫 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:ljc123456@localhost/mydatabase' # flaskSQLAlchemy db = SQLAlchemy(app)
# 繼承的類 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'>]
給網頁配置路由 也就是html文件。
query.filter_by flter_by 可使用 python 的正常參數傳遞方法傳遞條件,指定列名時,不須要額外指定類名。
query.filter filter 能夠像寫 sql 的 where 條件那樣寫 > < 等條件,但引用列名時,須要經過 類名.屬性名 的方式。
query.get 通常都是去找主建
filter_by: 用於查詢簡單的列名,不支持比較運算符
filter比filter_by的功能更強大,支持比較運算符,支持or_、in_等語法
flask-wtf 製做表單
安裝:pip install Flask-WTF
經過異部進行刪除,先請求再刪除
整理要用的jquery的知識來使用ajax處理事件
後面還要學習一些知識
用homebrew下載安裝
啓動:mongod
啓動mongodb數據庫
第13章 python操做resis網易新聞實戰