狠狠操夜夜甜|人妻在线中文字幕亚洲无码不卡av|一区二区欧美亚洲|日躁夜躁狠狠躁2001|亚洲,超碰,欧美|18AV成人电影|午夜成人免费在线|婷婷激情网深爱五月|色欲综合成人在线|在线美女搞黄大片

中企動力 > 頭條 > python有數(shù)據(jù)庫

網(wǎng)站性能檢測評分

注:本網(wǎng)站頁面html檢測工具掃描網(wǎng)站中存在的基本問題,僅供參考。

python有數(shù)據(jù)庫

python多進程快速批量爬取黃頁海量信息并保存文本和數(shù)據(jù)庫教程 企業(yè)視頻課程

img

執(zhí)情

關注

最近幫朋友做一些網(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è)視頻課程

img

常契

關注

前面說到兩種數(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)視頻課程

img

空口言

關注

在開發(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ù)庫操作技巧 公司視頻課程

img

利奧波特

關注

在日常的程序序開發(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ù)庫 流量視頻課程

img

Gary

關注

前言

恭喜你,非常明智的選擇了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編程》 公司視頻課程

img

Yao

關注

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ū)別,歡迎大家交流。

有前途的Python

Python操作Mysql數(shù)據(jù)庫入門——查看和增加記錄 企業(yè)視頻課程

img

牧代芙

關注

前言

最近學了一下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ù)庫 營銷視頻課程

img

鴿子

關注

關系數(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è)視頻課程

img

江代曼

關注

前面說到兩種數(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è)視頻課程

img

Gene

關注

前言

最近學了一下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ù)庫登錄密碼沒有修改~

文中如有錯誤和敘述不妥之處,望指正。

img

在線咨詢

建站在線咨詢

img

微信咨詢

掃一掃添加
動力姐姐微信

img
img

TOP