大綱
數據庫的基本操作
函數屬性&對象方法
連接數據庫
一樓的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比較好用”。
