python數據庫編程


大綱

數據庫的基本操作

函數屬性&對象方法

連接數據庫

一樓的ORM技術(sqlalchemy)

 

數據庫的基本操作

創建數據庫:

CREATE DATABASE test;

GRANT ALL ON test.* to user(s);

第一行創建了一個名為“test”的數據庫,假設你是數據庫的管理員,第二行語句可以為指定用戶(或所有用戶)提升權限

使用數據庫

USE test;

如果你已經登錄一個數據庫系統,但是還沒有選擇你希望使用的數據庫,這條簡單的語句可以讓你指定一個數據庫,用來執行數據庫操作。

刪除數據庫

DROP DATABASE test;

這條簡單的語句可以從數據庫中移除所有表和數據,並將其從系統中刪除。

創建表

CREATE TABLE users (login VARCHAR(8), userid INT, projid INT);

這條語句創建一個新表,其中包含字符串列login,以及兩個整型列:userid和projid。

刪除表

DROP TABLE users;

這條簡單的語句可以刪除數據庫中的一個表,並清空其中的所有數據。

插入行

INSERT INTO users VALUES('leanna',2111,1);

可以使用INSERT語句向數據庫中插入一個新行。需要指定表名以及其中每列的值。對於本例而言,字符串“leanna”對應於login參數,而2111和1分別對應於userid和projid。

更新行

UPDATE users SET projid=4 WHERE projid=2;

UPDATE users SET projid=1 WHERE userid=311;

為了修改表中已存在的行,需要使用UPDATE語句。使用SET來確定要修改的列,並提供條件來確定修改的行。在第一個例子中,所有“projid”為2的用戶需要改為4。而在第二個例子中,將指定用戶(這里是userid為311的用戶)移到編號為#1的項目組中。

刪除行

DELETE FROM users WHERE projid=%d;

DELETE FROM users;

為了刪除表中的行,需要使用DELETE FROM 命令,指定准備刪除的行的表名以及可選的條件。如果沒有這個條件,就會像第二個例子樣,把所有行都刪除了。

以上就是數據庫的一些基本的操作,從上我們可以看出:

創建數據庫(create)和刪除數據庫(drop),創建表和刪除表也一樣。

修改表中已存在的行叫做更新(update)和往數據庫里添加新行叫做插入(insert)

而移出表中已存在的行叫做刪除(delete)。

這些動作通常稱為數據庫命令或操作。使用可選的條件請求數據庫中的行稱為詢查(query)。

 

函數屬性&對象方法

connect()函數屬性

user                     用戶名
password               密碼
host                     主機名
database               數據庫名  MySQLdb數據庫使用的是db
dsn                      數據源名
connect()函數通過 Connection 對象訪問數據庫。兼容模塊必須實現 connect()函數,該函數創建並返回一個 Connection 對象。

應用與數據庫之間進行通信需要建立數據庫連接。它是最基本的機制,只有通過數據庫連接才能把命令傳遞到服務器,並得到返回的結果。當一個連接(或一個連接池)建立后,可以創建一個游標,向數據庫發送請求,然后從數據庫中接收回應。

 

Connection 對象方法
Connection 對象不需要包含任何數據屬性

close()                                關閉數據庫連接
commit()                                提交當前事務
rollback()                              取消當前事務
cursor()                                使用該連接創建(並返回)一個游標或類游標的對象
errorhandler(cxn,cur,errcls,errval)          作為給定連接的游標的處理程序                                

 

當使用 close()時,這個連接將不能再使用,否則會進入到異常處理中。

如果數據庫不支持事務處理,或啟用了自動提交功能,commit()方法都將無法使用。如果你願意,可以實現單獨的方法用來啟動或關閉自動提交功能。

處理的數據庫而言,只需要在方法中實現“pass”即可。

和 commit()相似,rollback()方法也只有在支持事務處理的數據庫中才有用。發生異常之后,rollback()會將數據庫的狀態恢復到事務處理開始時。

如果 RDBMS 不支持游標,那么 cursor()仍然會返回一個盡可能模仿真實游標的對象。這是最基本的要求。每個適配器開發者都可以為他的接口或數據庫專門添加特殊屬性。

當你完成數據庫連接並關閉游標時,需要對所有操作執行 commit(),並對你的連接執行close()。

 

Cursor 對象

arraysize                          使用fetchmany方法時,一次取出的結果行數,默認為1
connection                         創建此游標的鏈接(可選)
description                        返回游標活動狀態(7選項元組):(name,type_code,display_size,internal_size,precision,scale,null_ok)
lastrowid                          上次修改的行ID(可選:如果不支持行ID,則返回None)
rowcount                           上次execute*()方法處理或影響的行數
callproc(func[,args])              調用儲存過程
close()                              關閉游標
execute(op[,args])                執行數據庫查詢或命令
executemany(op,args)             類似execute()和map()的結合,為給定的所有參數准備執行的數據庫查詢或命令
fetchone()                           獲取查詢結果的下一行
fetchmany([size=cursor.arraysize])      獲取查詢結果的下面size行
fetchall()                            獲取查詢結果的所有(剩余)行
__iter__()                           為游標創建迭代器對象(可選,參考next())
messages                            游標執行后從數據庫中獲取的消息列表(元組結合,可選)
next()                                被迭代器用於獲取查詢結果的下一行(可選,類似fetchone(),參考__iter__())
nextset()                             移動到下一個結果集合(如果支持)
rownumber                            當前結果集中游標的索引(以行為單位,從0開始,可選)
setinputsizes(sizes)               設置允許的最大輸入大小(必須有,但是實現是可選的)
setoutputsize(size[,col])         設置大列獲取的最大緩沖區大小(必須有,但是實現是可選的)

當建立連接后,就可以和數據庫進行通信了。游標可以讓用戶提交數據庫命令,並獲得查詢的結果行。

當游標創建好后,就可以執行查詢或命令(或多個查詢和命令),並從結果集中取回一行或多行結果。

游標對象最重要的屬性是 execute*()和 fetch*()方法,所有針對數據庫的服務請求都是通過它們執行的。arraysize 數據屬性在為 fetchmany()設置默認大小時非常有用。當然,在不需要時關閉游標是個好主意,而如果你的數據庫支持存儲過程,可能會用到callproc()。

 

類對象和構造函數

Date (yr, mo, dy)                  日期值對象
Time (hr, min, sec)                  時間值對象
Timestamp (yr, mo, dy, hr, min, sec)         時間戳值對象
DateFromTicks (ticks)                日期對象,給出從新紀元時間(1970 年 1 月 1 日 00:00:00 UTC)以來的秒數
TimeFromTicks (ticks)                時間對象,給出從新紀元時間(1970 年 1 月 1 日 00:00:00 UTC)以來的秒數
TimestampFromTicks (ticks)             時間戳對象,給出從新紀元時間(1970 年 1 月 1 日 00:00:00 UTC)以來的秒數
Binary (string)                   對應二進制(長)字符串對象
STRING                       表示基於字符串列的對象,比如 VARCHAR
BINARY                        表示(長)二進制列的對象,比如 RAW、BLOB
NUMBER                       表示數值列的對象
DATETIME                      表示日期/時間列的對象
ROWID                       表示“行 ID”列的對象

 

連接數據庫

以MySQL為例:

打開cmd輸入:pip3 install mysqlclient    安裝mysql驅動
>>> import MySQLdb as mysql         導入MySQL驅動重名為mysql
>>> conn = mysql.connect('127.0.0.1','root','root')            連接數據庫
>>> conn = mysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='test', charset='utf8')        也可以使用關鍵字連接數據庫
>>> config = {
    'host': '127.0.0.1',
    'port': 3306,
    'user': 'root',
    'passwd': 'root',
    'db': 'test',
    'charset': 'utf8'
}
>>> conn = mysql.connect(**config)        也可以使用字典連接數據庫
>>> cur = conn.cursor()      創建cursor對象
>>> cur.execute('create table users (id varchar(20) primary key, name varchar(20))')         創建users表
>>> id = 1
>>> name = "smelond"
>>> cur.execute("insert into users values('%s','%s')" % (id,name))            插入一行記錄,注意MySQL的占位符是%s
>>> cur.execute("update users set id=2 where id=1")                      修改一行記錄
>>> cur.execute("select * from users")                    查詢記錄
>>> values = cur.fetchall()                    將查詢的記錄賦給values
>>> values                                         輸出values
(('2', 'smelond'),)
>>> cur.execute("insert into users values(3,'admin')")                     再次添加記錄
>>> cur.execute("select * from users")
>>> values = cur.fetchall()
>>> values
(('2', 'smelond'), ('3', 'admin'))

>>> conn.commit()             提交
>>> cur.close()              關閉cursor
>>> conn.close()                關閉connection

 

ORM技術(sqlalchemy)

在Python中,最有名的ORM框架是SQLAlchemy

安裝SQLAlchemy

pip3 install sqlalchemy
# 導入模塊
from sqlalchemy import Column, String, create_engine, INT
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 創建對象的基類:
Base = declarative_base()


# 定義User對象
class User(Base):
    __tablename__ = "users"

    # 表的結構
    id = Column(INT, primary_key=True)
    name = Column(String(20))


# 初始化數據庫連接
# create_engine()用來初始化數據庫連接。SQLAlchemy用一個字符串表示連接信息
engine = create_engine("mysql://root:root@127.0.0.1:3306/test")
# 創建DBSession類型
DBSession = sessionmaker(bind=engine)

向數據庫表中添加一行記錄。
由於有了ORM,我們向數據庫表中添加一行記錄,可以視為添加一個User對象:

# 創建session對象
session = DBSession()
# 創建新User對象
new_user = User(name='smelond')  # 由於我在數據庫里面設置id為主鍵,並且自動增長,所以這個地方可以不帶id。
# 添加到session
session.add(new_user)
# 提交即保存到數據庫
session.commit()
# 關閉session
session.close()

關鍵是獲取session,然后把對象添加到session,最后提交並關閉。DBSession對象可視為當前數據庫連接。

查詢記錄:

# 創建session對象
session = DBSession()
# 創建Query查詢,filter是where條件,最后調用one()返回唯一行,如果條用all()則返回所有行:
result = session.query(User).filter(User.name == 'smelond').one()
print("type:", type(result))
print("name:", result.name)
session.close()


結果:
type: <class '__main__.User'>
name: smelond

 從上面我們可以看出“還是ORM比較好用”。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM