網(wǎng)站性能檢測評分
注:本網(wǎng)站頁面html檢測工具掃描網(wǎng)站中存在的基本問題,僅供參考。
python有數(shù)據(jù)庫
python多進程快速批量爬取黃頁海量信息并保存文本和數(shù)據(jù)庫教程 企業(yè)視頻課程
最近幫朋友做一些網(wǎng)絡營銷的工作,需要抓取一些客源信息,用以輔助營銷,我感覺很多做電商的朋友,尤其是微商朋友們,應該都是比較需要各種客源信息的吧,今天,小編我就借此機會把利用python多進程的方式抓取黃頁海量的客源信息的方法分享給大家,希望大家能多多關注本人,多討論關于爬蟲和數(shù)據(jù)挖掘分析相關的問題。
該代碼已經(jīng)上傳至本人的github,喜歡的朋友可到我的公眾號獲取。
一、特別提到的庫:
多進程:pool
mogo數(shù)據(jù)庫:pymongo
自然語言編碼轉(zhuǎn)換:codecs
二、特別推薦----jupyter
做開發(fā)沒有趁手的兵器是不行的,對于python腳本的開發(fā)以及做一些數(shù)據(jù)挖掘和分析這方面工作來說,jupyter notebook這個工具是一個非常合適的工具,它可以保存你寫的階段性的小腳本,同時,又不至于像ipython那樣把有價值的歷史代碼被滾屏所淹沒,關于這個工具的其他優(yōu)點,大家可以自行百度,總之,這是一個python開發(fā)的一個神器,借助它可以快速的寫出很多高效的代碼出來。
三、主要代碼:
這次抓取的站點是黃頁88網(wǎng),網(wǎng)站放置行業(yè)信息的結構是這樣的,按照行業(yè)來抓取的話,首先是分為各種行業(yè),每種行業(yè)下面又可以獲取到各個省份的該行業(yè)的信息。
為了能夠按照行業(yè)進行抓取,我們可以先把首頁出現(xiàn)的行業(yè)分類抓取下來,保存為字典,這一步的方法就不仔細說了,請自行解決。我已經(jīng)保存好了字典,將起保存在一個單獨的配置文件中,方便調(diào)用時使用。
獲取各個行業(yè)對應的每個省的url,我們可以寫一個函數(shù)來完成,返回一個url的列表。
有了這個url以后,就可以直接得到內(nèi)容了,其中翻頁的時候需要注意url中控制頁碼是通過pn變量實現(xiàn)的,也需要對最后一頁做一下判斷,否則就會形成死循環(huán)。這一步就已經(jīng)把數(shù)據(jù)寫入了txt文件中。
最后是執(zhí)行爬蟲的的代碼,這里用到了多線程,同時需要存入mongodb的數(shù)據(jù)庫。
由于自媒體發(fā)布的時候貼代碼不太方便,感興趣的朋友關注我的同名訂閱號獲取github地址吧!
python web的數(shù)據(jù)庫框架 企業(yè)視頻課程
前面說到兩種數(shù)據(jù)庫是各有優(yōu)點各有所長的。對于python來說,大多數(shù)的數(shù)據(jù)庫引擎都是有對應的數(shù)據(jù)包的。Flask框架并不限制使用哪一種數(shù)據(jù)庫,因此是可以根據(jù)需要自由選擇SQL抑或是NoSQL。
對于稍后的學習,由于我們的只是學習版的小程序,所以選擇哪一種都是很好的,不會有什么性能影響。
常用的SQL數(shù)據(jù)庫框架有:MySQL,cx_Oracle,Postgres,SQLite等
常見的NoSQL數(shù)據(jù)庫框架有:Redis,MongoDB,CouchDB等。
當然,如果不想用傳統(tǒng)的數(shù)據(jù)庫框架,python還提供了數(shù)據(jù)庫抽象層代碼包,如SQLAlchemy和MongoEngine。使用這些抽象包可以直接處理高級的python對象,而不需要處理表等數(shù)據(jù)庫實體。
對于如此多的選擇,在Flask項目中,我們在使用前應該考慮什么因素呢?
易用性:顯然使用ORM抽象層明顯是比直接操作數(shù)據(jù)庫要更簡單,可以使我們在不知不覺的情況下,把高層的面向?qū)ο蟛僮鬓D(zhuǎn)換成低層的數(shù)據(jù)庫指令。如果易用第一,則選擇ORM方式的。
性能:從來,任何事都是有代價的,ROM抽象層易用的同時,必定帶來了額外的開銷,雖然,多數(shù)情況下,這種開銷使得效率降低很微小,但是某些情況卻不是如此,另外,直接操作數(shù)據(jù)庫底層,會有更高的控制自由度,利于優(yōu)化,所以,當效率第一時,選擇傳統(tǒng)數(shù)據(jù)庫框架比較好。
可移植性:能否再開發(fā)平臺與生產(chǎn)平臺中使用,這個是必須考慮的問題。如果是云平臺托管代碼,提前了解云服務提供哪些選擇是很有必要的。
Flask集成度:雖然,選擇框架的時候,不一定要選擇集成了Flask的框架,但選擇這些框架可以節(jié)省關于集成編碼的時間,而且,能簡化配置和操作,所以,選擇專門為Flask開發(fā)的擴展是值得優(yōu)先考慮的。
教授要我用python把電腦系統(tǒng)所有信息獲取保存到數(shù)據(jù)庫,太簡單了 互聯(lián)網(wǎng)視頻課程
在開發(fā)目錄下新建一個python的包,然后包含四個python文件:mem.py、load.py、disk.py、cpu.py以及一個程序運行的主文件main.py,結構如下:
編寫mem.py 文件
編寫load.py文件
編寫disk.py文件
編寫cpu.py文件
編寫main.py文件
運行結果截圖:
本文來自Lockeyi
Python數(shù)據(jù)庫操作技巧 公司視頻課程
在日常的程序序開發(fā)過程中,經(jīng)常要跟關系數(shù)據(jù)庫打交道。python異步連接數(shù)據(jù)庫用aiomysql,筆者就在使用此庫過程中的一些心得和技巧記錄如下。
我們先看一下同步數(shù)據(jù)庫連接方法,PyMySQL官方給的使用方法如下:
在日常使用過程序中,如果均采用這樣的方法來操作數(shù)據(jù)庫,代碼的編寫量很大,而且容易出錯,現(xiàn)就異步程序數(shù)據(jù)庫連接解決辦法歸納如下,如果是同步程序,就可以依據(jù)異步程序相應做修改即可,思路是一模一樣的:
創(chuàng)建連接池
我們需要創(chuàng)建一個全局的連接池,每個HTTP請求都可以從連接池中直接獲取數(shù)據(jù)庫連接。使用連接池的好處是不必頻繁地打開和關閉數(shù)據(jù)庫連接,而是能復用就盡量復用。缺省情況下將編碼設置為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
封裝增刪改查
訪問數(shù)據(jù)庫需要創(chuàng)建數(shù)據(jù)庫連接、游標對象,然后執(zhí)行SQL語句,最后處理異常,清理資源。這些訪問數(shù)據(jù)庫的代碼如果分散到各個函數(shù)中,勢必無法維護,也不利于代碼復用。所以,我們要首先把常用的SELECT、INSERT、UPDATE和DELETE操作用函數(shù)封裝起來。由于Web框架使用了基于asyncio的aiohttp,這是基于協(xié)程的異步模型。在協(xié)程中,不能調(diào)用普通的同步IO操作,因為所有用戶都是由一個線程服務的,協(xié)程的執(zhí)行速度必須非常快,才能處理大量用戶的請求。而耗時的IO操作不能在協(xié)程中以同步的方式調(diào)用,否則,等待一個IO操作時,系統(tǒng)無法響應任何其他用戶。這就是異步編程的一個原則:一旦決定使用異步,則系統(tǒng)每一層都必須是異步,“開弓沒有回頭箭”。幸運的是 aiomysql 為MySQL數(shù)據(jù)庫提供了異步IO的驅(qū)動。
1. 要執(zhí)行SELECT語句,我們用select函數(shù)執(zhí)行,需要傳入SQL語句和SQL參數(shù):
async def fetchone(sql, args=(), size=None):
"""封裝select,查詢單個,返回數(shù)據(jù)為字典"""
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,查詢多個,返回數(shù)據(jù)為列表"""
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
注意要始終堅持使用帶參數(shù)的SQL,而不是自己拼接SQL字符串,這樣可以防止SQL注入攻擊。如果傳入size參數(shù),就通過fetchmany()獲取最多指定數(shù)量的記錄,否則,通過fetchall()獲取所有記錄。
2. 封裝Insert, Update, Delete
要執(zhí)行INSERT、UPDATE、DELETE語句,可以定義一個通用的execute()函數(shù),因為這3種SQL的執(zhí)行都需要相同的參數(shù),以及返回一個整數(shù)表示影響的行數(shù):
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()函數(shù)和select()函數(shù)所不同的是,cursor對象不返回結果集,而是通過rowcount返回結果數(shù)。
Python Web之Django連接MySQL數(shù)據(jù)庫 流量視頻課程
前言
恭喜你,非常明智的選擇了Django作為你項目開發(fā)的基礎框架(手動滑稽)!
1.1.Django項目連接mysql數(shù)據(jù)庫
Django項目要操作數(shù)據(jù)庫,首先要和數(shù)據(jù)庫建立連接,才能讓程序中的數(shù)據(jù)和數(shù)據(jù)庫關聯(lián)起來進行增刪改查操作。
Django項目默認使用mysqldb模塊進行和mysql數(shù)據(jù)庫之間的交互操作,但是mysqldb模塊對于python3.4以上的版本支持還不夠完善,所以我們要使用替代方案。
通過pymysql模塊完成和數(shù)據(jù)庫之間的交互過程
Django連接mysql數(shù)據(jù)庫的操作,是通過根模塊的配置實現(xiàn)的,在項目根模塊的配置文件settings.py中,我們可以查詢到如下DATABASES的配置信息:
settings.py配置文件
ENGINE:用于特定的數(shù)據(jù)庫引擎的配置,一般如下幾種:
django.db.backends.sqlite3django.db.backends.postgresqldjango.db.backends.mysqldjango.db.backends.oracle
其余的參數(shù)分別是:
NAME:要連接的數(shù)據(jù)庫名稱的配置;
USER:配置連接數(shù)據(jù)庫的用戶賬號;
PASSWORD:配置連接數(shù)據(jù)庫的登錄密碼;
HOST:配置數(shù)據(jù)庫所在的主機IP地址;
PORT:配置連接數(shù)據(jù)庫的端口號;
CHARSET:配置連接數(shù)據(jù)庫交互數(shù)據(jù)編碼格式。
如圖:
修改DATABASES配置
如此,Django和數(shù)據(jù)庫之間的連接關系就建立了。
1.2.定義創(chuàng)建模型
在Django項目中定義模型數(shù)據(jù),其實就是定義class類型,通過類型創(chuàng)建的對象來封裝管理數(shù)據(jù),一定要在這里明確關聯(lián)和對應關系。
定義創(chuàng)建模型
有了對應關系之后,我們要創(chuàng)建的模型對象的屬性必須和數(shù)據(jù)庫中的字段類型對應起來:
對應關系
每個字段定義時,都會有自己的一些特殊的選項指定:
主鍵和唯一約束等
在大部分項目中,還會涉及到多表關聯(lián)操作:
多表關聯(lián)操作
根據(jù)創(chuàng)建的個人博客,創(chuàng)建用戶類型和文章類型如下:
mysite/myblog/views.py
創(chuàng)建文章類型和作者類型
2.數(shù)據(jù)庫同步操作
創(chuàng)建好我們需要的模型類之后,需要將創(chuàng)建好的類型添加到數(shù)據(jù)庫中并同時建立關聯(lián)關系,根據(jù)模型類自動生成對應數(shù)據(jù)庫引擎的sql語句。在settings.py中,連接數(shù)據(jù)庫信息中配置了數(shù)據(jù)庫引擎,其實就是已經(jīng)告訴Django我們使用的是哪個數(shù)據(jù)庫了,Django會根據(jù)指定的數(shù)據(jù)庫自動生成sql語句。
python manage.py makemigrations
自動創(chuàng)建指定數(shù)據(jù)庫的sql語句
查看生成的sql語句
通過命令自動生成sql語句之后是存儲在文件中的,我們可以通過命令的方式直接查看生成的sql語句:
例:python manage.py sqlmigrate myblog 0001
自動同步到數(shù)據(jù)庫
既然Django可以自動生成sql語句,當然可以自動同步到數(shù)據(jù)庫中,并不需要開發(fā)人員再去手工創(chuàng)建各種數(shù)據(jù)表了:
例:python manage.py migrate
同步數(shù)據(jù)庫命令
此時,再查看你的數(shù)據(jù)庫,好好享受Django框架帶來的便捷吧!
「技術文章」《Python 數(shù)據(jù)庫 GUI CGI編程》 公司視頻課程
1.寫在前邊
上一次,我們介紹了Python的入門的文章,今天我們就來介紹下Python的數(shù)據(jù)庫,GUI, CGI的編程,以及Python 2.x 與Python 3.x的區(qū)別。
2.連接數(shù)據(jù)庫
Python 標準數(shù)據(jù)庫接口為 Python DB-API,MySQLdb 是用于Python鏈接Mysql數(shù)據(jù)庫的接口。使用的時候,必須安裝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 查詢數(shù)據(jù)庫
代碼在GitHub上的源碼地址:http://t/RQjcvfl
數(shù)據(jù)庫的輸出效果3. GUI編程
Python 提供了多個圖形開發(fā)界面的庫,其中Tkinter 是 Python 的標準 GUI 庫。Python 使用 Tkinter 可以快速的創(chuàng)建 GUI 應用程序。
代碼在GitHub上的源碼地址:http://t/RQjcvfl
Python的GUI編程mac系統(tǒng)下GUI的效果4. CGI編程
1)Python的CGIHTTPServer一般是與python一起安裝的,使用如下命令既可以啟動,為了便于組織目錄,建議先建立一個目錄,比如web,然后再運行下面的命令。
nohup python -m CGIHTTPServer 8088 &
原理圖2)靜態(tài)文件代碼地址: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區(qū)別
5.1 兩者不兼容
Python的3.0版本,常被稱為Python 3000,或簡稱Py3k。相對于Python的早期版本,這是一個較大的升級。
為了不帶入過多的累贅,Python 3.0在設計的時候沒有考慮向下相容。
許多針對早期Python版本設計的程式都無法在Python 3.0上正常執(zhí)行。
為了照顧現(xiàn)有程序,Python 2.6作為一個過渡版本,基本使用了Python 2.x的語法和庫,同時考慮了向Python 3.0的遷移,允許使用部分Python 3.0的語法與函數(shù)。
5.2 一圖勝千言
Python2與Python3區(qū)別可以升級的自己的python版本,建議直接采用Python3,畢竟是趨勢。使用 “2to3工具”也是不錯的選擇。
6. 寫在最后
本文簡單接受了Python的數(shù)據(jù)庫鏈接,GUI, CUI的簡單編程,最后簡單介紹了Python2 與Python3的區(qū)別,歡迎大家交流。
有前途的PythonPython操作Mysql數(shù)據(jù)庫入門——查看和增加記錄 企業(yè)視頻課程
前言
最近學了一下sql,因為做數(shù)據(jù)分析不會sql真不行。
平時學的都是Python,所以如果要用pandas做數(shù)據(jù)分析,數(shù)據(jù)除了導入excel和csv文件,
應該還要會從數(shù)據(jù)庫中導入數(shù)據(jù)到Python中,于是我進行了以下的學習和探索。
環(huán)境
Python 3.X
IDE : juyter notebook
安裝必要的模塊
進入:
http://lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
找到適合自己的版本
下載到本地(我的下載到e:盤根目錄)
然后打開cmd如下圖安裝
這里推薦本地安裝
使用Python連接數(shù)據(jù)庫
import MySQLdb
如果導入模塊沒報錯,恭喜你,安裝模塊成功了!
conn = MySQLdb.connect( host = '127.0.0.1',#本地地址 user = 'root',#一般默認用戶名 passwd = '********',#本地數(shù)據(jù)庫登錄密碼 db = 'test',#數(shù)據(jù)庫名稱 port = 3306,#安裝mysql默認的端口號 charset = 'utf8'#設置數(shù)據(jù)庫統(tǒng)一編碼)
通過connect方法連接本地mysql數(shù)據(jù)庫,這里要注意你要修改的或許是登錄密碼和數(shù)據(jù)庫名稱
創(chuàng)建游標
首先,我們要創(chuàng)建一個游標
cursor = conn.cursor()
什么是游標呢?
游標就相當于一個緩沖區(qū),存放暫時的結果(這是我的理解)
就像去超市買買買,你可能要推一個手推車,這里的手推車就像游標,推著手推車去對應的貨架完成挑選操作,而手推車最終會在出超市時候清空
觀察數(shù)據(jù)庫
我本地的數(shù)據(jù)庫test中有個tdb_goods的表
表的內(nèi)容如上圖所示
有商品的id,名稱,種類id,品牌id,是否在售和是否下架幾個字段
一共有23條記錄
獲取數(shù)據(jù)
我們使用select語句可以獲取數(shù)據(jù)
cursor.execute('SELECT * FROM `tdb_goods`;')data = cursor.fetchone()#取一條數(shù)據(jù)print(data)
首先我們用游標的execute方法執(zhí)行一句sql語句獲取tdb_goods中的所有數(shù)據(jù)
然后使用游標的fetchone方法取出其中一條記錄并且展現(xiàn)出來
如上圖,我們?nèi)〕龅臄?shù)據(jù)是元組形式
當然,我們應該養(yǎng)成打開后關閉的好習慣,所以,在操作結束,應該斷開與數(shù)據(jù)庫的連接
conn.close()
異常處理
當我們在操作時,希望和在mysql數(shù)據(jù)庫中一樣,異常時會提示異常信息
那么我們就要加入異常處理模塊
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時候,就是取出所有信息了
使用面向?qū)ο缶幊?/p>
如果你熟悉面向?qū)ο缶幊袒蛘呖催^我寫的面向?qū)ο缶幊倘腴T系列(小姐姐系列)
傳送門:
Python面向?qū)ο缶幊虖牧汩_始(1)——從沒對象到有對象
Python面向?qū)ο缶幊虖牧汩_始(2)—— 與對象相互了解
Python面向?qū)ο缶幊虖牧汩_始(3)—— 小姐姐請客上篇
Python面向?qū)ο缶幊虖牧汩_始(4)—— 小姐姐請客下篇
Python面向?qū)ο缶幊虖牧汩_始(5)—— 小姐姐要買房
如果你還沒接觸過面向?qū)ο缶幊?,看完以?篇至少對接下來的內(nèi)容理解上不存在問題
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,然后用類創(chuàng)建一個對象名為object,在創(chuàng)建對象的時候,類的初始化時調(diào)用連接數(shù)據(jù)庫函數(shù)
創(chuàng)建了一個叫object的對象,使用對象的get_a方法從數(shù)據(jù)庫tdb_goods中選出cate_id=1的一條記錄,在get_a函數(shù)最后位置斷開數(shù)據(jù)庫連接
結果如下:
插入記錄到數(shù)據(jù)庫
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()
注:這里,將一條記錄插入了數(shù)據(jù)庫,但是當我執(zhí)行完這條語句(沒報錯)
刷新數(shù)據(jù)庫并沒有新增一條記錄
劃重點:在這里,有一個self.connmit(),這個叫提交,如果不寫這句,就無法將所做修改保存的數(shù)據(jù)庫中
加上這個之后(加在以下兩句之間):
可以看到,數(shù)據(jù)成功寫入數(shù)據(jù)庫了~
如果運行代碼報錯,很可能是你的數(shù)據(jù)庫名和數(shù)據(jù)庫登錄密碼沒有修改~
文中如有錯誤和敘述不妥之處,望指正。
Python和主流數(shù)據(jù)庫 營銷視頻課程
關系數(shù)據(jù)庫和非關系數(shù)據(jù)庫
1).什么是關系數(shù)據(jù)庫
關系型數(shù)據(jù)庫,是指采用了關系模型來組織數(shù)據(jù)的數(shù)據(jù)庫,簡單來說,關系模型指的就是二維表格模型,而一個關系型數(shù)據(jù)庫就是由二維表及其之間的聯(lián)系所組成的一個數(shù)據(jù)組織。象銀行系統(tǒng)會大量的用關系數(shù)據(jù)庫.比如大家經(jīng)常用的MySQL就是典型的關系數(shù)據(jù)庫.
優(yōu)點:
容易理解:二維表結構是非常貼近邏輯世界的一個概念,關系模型相對網(wǎng)狀、層次等其他模型來說更容易理解
使用方便:通用的SQL語言使得操作關系型數(shù)據(jù)庫非常方便
易于維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數(shù)據(jù)冗余和數(shù)據(jù)不一致的概率
2).什么是非關系數(shù)據(jù)庫
關系數(shù)據(jù)庫雖然很好,但是隨著互聯(lián)網(wǎng)大規(guī)模的爆發(fā),弱點也越來越明顯,比如事務的一致性,多表聯(lián)查,高并發(fā)等等瓶頸很明顯。
于是NoSQL一詞橫空出世,以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據(jù)需要增加一些自己的鍵值對,這樣就不會局限于固定的結構,可以減少一些時間和空間的開銷。比如MongoDb就是典型的NoSQL型數(shù)據(jù)庫(鍵值對大家想到了什么,對json格式).
DB-API,Python DB-API為開發(fā)人員提供了數(shù)據(jù)庫應用編程接口,也就是說使用它連接各數(shù)據(jù)庫后,就可以用相同的方式操作各數(shù)據(jù)庫。
python web的數(shù)據(jù)庫框架 企業(yè)視頻課程
前面說到兩種數(shù)據(jù)庫是各有優(yōu)點各有所長的。對于python來說,大多數(shù)的數(shù)據(jù)庫引擎都是有對應的數(shù)據(jù)包的。Flask框架并不限制使用哪一種數(shù)據(jù)庫,因此是可以根據(jù)需要自由選擇SQL抑或是NoSQL。
對于稍后的學習,由于我們的只是學習版的小程序,所以選擇哪一種都是很好的,不會有什么性能影響。
常用的SQL數(shù)據(jù)庫框架有:MySQL,cx_Oracle,Postgres,SQLite等
常見的NoSQL數(shù)據(jù)庫框架有:Redis,MongoDB,CouchDB等。
當然,如果不想用傳統(tǒng)的數(shù)據(jù)庫框架,python還提供了數(shù)據(jù)庫抽象層代碼包,如SQLAlchemy和MongoEngine。使用這些抽象包可以直接處理高級的python對象,而不需要處理表等數(shù)據(jù)庫實體。
對于如此多的選擇,在Flask項目中,我們在使用前應該考慮什么因素呢?
易用性:顯然使用ORM抽象層明顯是比直接操作數(shù)據(jù)庫要更簡單,可以使我們在不知不覺的情況下,把高層的面向?qū)ο蟛僮鬓D(zhuǎn)換成低層的數(shù)據(jù)庫指令。如果易用第一,則選擇ORM方式的。
性能:從來,任何事都是有代價的,ROM抽象層易用的同時,必定帶來了額外的開銷,雖然,多數(shù)情況下,這種開銷使得效率降低很微小,但是某些情況卻不是如此,另外,直接操作數(shù)據(jù)庫底層,會有更高的控制自由度,利于優(yōu)化,所以,當效率第一時,選擇傳統(tǒng)數(shù)據(jù)庫框架比較好。
可移植性:能否再開發(fā)平臺與生產(chǎn)平臺中使用,這個是必須考慮的問題。如果是云平臺托管代碼,提前了解云服務提供哪些選擇是很有必要的。
Flask集成度:雖然,選擇框架的時候,不一定要選擇集成了Flask的框架,但選擇這些框架可以節(jié)省關于集成編碼的時間,而且,能簡化配置和操作,所以,選擇專門為Flask開發(fā)的擴展是值得優(yōu)先考慮的。
Python操作Mysql數(shù)據(jù)庫入門——查看和增加記錄 行業(yè)視頻課程
前言
最近學了一下sql,因為做數(shù)據(jù)分析不會sql真不行。
平時學的都是Python,所以如果要用pandas做數(shù)據(jù)分析,數(shù)據(jù)除了導入excel和csv文件,
應該還要會從數(shù)據(jù)庫中導入數(shù)據(jù)到Python中,于是我進行了以下的學習和探索。
環(huán)境
Python 3.X
IDE : juyter notebook
安裝必要的模塊
進入:
http://lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
找到適合自己的版本
下載到本地(我的下載到e:盤根目錄)
然后打開cmd如下圖安裝
這里推薦本地安裝
使用Python連接數(shù)據(jù)庫
import MySQLdb
如果導入模塊沒報錯,恭喜你,安裝模塊成功了!
conn = MySQLdb.connect( host = '127.0.0.1',#本地地址 user = 'root',#一般默認用戶名 passwd = '********',#本地數(shù)據(jù)庫登錄密碼 db = 'test',#數(shù)據(jù)庫名稱 port = 3306,#安裝mysql默認的端口號 charset = 'utf8'#設置數(shù)據(jù)庫統(tǒng)一編碼)
通過connect方法連接本地mysql數(shù)據(jù)庫,這里要注意你要修改的或許是登錄密碼和數(shù)據(jù)庫名稱
創(chuàng)建游標
首先,我們要創(chuàng)建一個游標
cursor = conn.cursor()
什么是游標呢?
游標就相當于一個緩沖區(qū),存放暫時的結果(這是我的理解)
就像去超市買買買,你可能要推一個手推車,這里的手推車就像游標,推著手推車去對應的貨架完成挑選操作,而手推車最終會在出超市時候清空
觀察數(shù)據(jù)庫
我本地的數(shù)據(jù)庫test中有個tdb_goods的表
表的內(nèi)容如上圖所示
有商品的id,名稱,種類id,品牌id,是否在售和是否下架幾個字段
一共有23條記錄
獲取數(shù)據(jù)
我們使用select語句可以獲取數(shù)據(jù)
cursor.execute('SELECT * FROM `tdb_goods`;')data = cursor.fetchone()#取一條數(shù)據(jù)print(data)
首先我們用游標的execute方法執(zhí)行一句sql語句獲取tdb_goods中的所有數(shù)據(jù)
然后使用游標的fetchone方法取出其中一條記錄并且展現(xiàn)出來
如上圖,我們?nèi)〕龅臄?shù)據(jù)是元組形式
當然,我們應該養(yǎng)成打開后關閉的好習慣,所以,在操作結束,應該斷開與數(shù)據(jù)庫的連接
conn.close()
異常處理
當我們在操作時,希望和在mysql數(shù)據(jù)庫中一樣,異常時會提示異常信息
那么我們就要加入異常處理模塊
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時候,就是取出所有信息了
使用面向?qū)ο缶幊?/p>
如果你熟悉面向?qū)ο缶幊袒蛘呖催^我寫的面向?qū)ο缶幊倘腴T系列(小姐姐系列)
傳送門:
Python面向?qū)ο缶幊虖牧汩_始(1)——從沒對象到有對象
Python面向?qū)ο缶幊虖牧汩_始(2)—— 與對象相互了解
Python面向?qū)ο缶幊虖牧汩_始(3)—— 小姐姐請客上篇
Python面向?qū)ο缶幊虖牧汩_始(4)—— 小姐姐請客下篇
Python面向?qū)ο缶幊虖牧汩_始(5)—— 小姐姐要買房
如果你還沒接觸過面向?qū)ο缶幊?,看完以?篇至少對接下來的內(nèi)容理解上不存在問題
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,然后用類創(chuàng)建一個對象名為object,在創(chuàng)建對象的時候,類的初始化時調(diào)用連接數(shù)據(jù)庫函數(shù)
創(chuàng)建了一個叫object的對象,使用對象的get_a方法從數(shù)據(jù)庫tdb_goods中選出cate_id=1的一條記錄,在get_a函數(shù)最后位置斷開數(shù)據(jù)庫連接
結果如下:
插入記錄到數(shù)據(jù)庫
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()
注:這里,將一條記錄插入了數(shù)據(jù)庫,但是當我執(zhí)行完這條語句(沒報錯)
刷新數(shù)據(jù)庫并沒有新增一條記錄
劃重點:在這里,有一個self.connmit(),這個叫提交,如果不寫這句,就無法將所做修改保存的數(shù)據(jù)庫中
加上這個之后(加在以下兩句之間):
可以看到,數(shù)據(jù)成功寫入數(shù)據(jù)庫了~
如果運行代碼報錯,很可能是你的數(shù)據(jù)庫名和數(shù)據(jù)庫登錄密碼沒有修改~
文中如有錯誤和敘述不妥之處,望指正。