測(cè)試中用的SQL語(yǔ)言最多的就是增悔常、刪、改给赞、查机打,如果在測(cè)試工具中使用問題不大,在Python或其它語(yǔ)言編寫腳本使用時(shí)塞俱,就有一個(gè)不容忽視的問題姐帚,在此先留個(gè)懸念,簡(jiǎn)單介紹以下增刪改查-
SELECT:
SELECT * FROM table_name ——選取表中所有內(nèi)容
SELECT * FROM table_name WHERE … ——選取表中所有符合條件的內(nèi)容
SELECT column_name,column_name FROM table_name ——選取表中需要的內(nèi)容
INSERT INTO:
INSERT INTO table_name VALUES (value1, value2, value3, ...) ——在表中插入數(shù)據(jù)
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...) ——在表中指定列插入對(duì)應(yīng)數(shù)據(jù)
UPDATE:
UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value ——更新表中已存在的數(shù)據(jù)
DELETE:
DELETE FROM table_name WHERE some_column=some_value ——?jiǎng)h除表中指定數(shù)據(jù)障涯,如果沒有WHERE...可(跑)以(路)試一下
Python與數(shù)據(jù)庫(kù)之間的交互:
import sqlite3 # python自帶的罐旗,根據(jù)需求自己調(diào)用
data = [('Tom', 'male', 22), ('Jenny', 'female', '18'), ('Huke', 'male', '29')]
db = sqlite3.connect('test.db') # 連接數(shù)據(jù)庫(kù)
cur = db.cursor() # 創(chuàng)建一個(gè)游標(biāo)
cur.execute('CREATE TABLE test (name TEXT, sex TEXT, age INTEGER)') # 創(chuàng)建數(shù)據(jù)庫(kù)表
# execute用來執(zhí)行SQL語(yǔ)言
cur.execute('INSERT INTO test VALUES ("Jack", "male", 24)') # 增
cur.execute('DELETE FROM test WHERE age=24') # 刪
cur.executemany('INSERT INTO test VALUES (?, ?, ?)', data) # 增加多行數(shù)據(jù)
cur.execute('UPDATE test SET age=15 WHERE name="Jenny"') # 改
cur.execute('SELECT * FROM test WHERE age <= 30') # 查
如果想執(zhí)行的查詢操作需要接受用戶提供的輸入數(shù)據(jù)膳汪,請(qǐng)確保用?隔開參數(shù)九秀。我們絕對(duì)不應(yīng)該用Python的字符串格式化(即%)或者.format()方法來創(chuàng)建這種字符串遗嗽。如果這樣的格式化操作符提供的值來自于用戶的輸入,那么這就等于將你的程序敞開大門迎接SQL注入攻擊鼓蜒。在查詢操作中痹换,特殊的?通配符會(huì)指示數(shù)據(jù)庫(kù)后端啟用自己的字符串替換機(jī)制都弹,這樣才能做的安全(希望如此)娇豫。不過數(shù)據(jù)庫(kù)后端對(duì)通配符的支持并不一致,有許多模塊采用的是?或%s畅厢。
以上一大段話(安全問題)來自《Python Cookbook》第3版Page200
如果在編寫腳本時(shí)經(jīng)常會(huì)用到SQL語(yǔ)言冯痢,每次使用cur.exexute('…')顯然是一件很麻煩的事情,可以考慮定義一個(gè)類:
# -*- coding: utf-8 -*-
import sqlite3
import re
class QuickSQL:
def __init__(self, data, table):
self.data = data
self.table = table
self.db = sqlite3.connect(self.data)
self.cur = self.db.cursor()
self.cur.execute('CREATE TABLE {} (id INT IDENTITY(1,1))'.format(table))
def create(self, *args):
table = self.table
for each in args:
self.cur.execute('ALTER TABLE {} ADD {} TEXT'.format(table, each))
self.db.commit()
def select(self, col, search_x, condition='='):
if re.search('\W', col + search_x) is not None:
print('請(qǐng)輸入合法字符框杜!')
if col == '' or search_x == '' or len(col) > 15 or len(search_x) > 15: # 禁止輸入空條件以及長(zhǎng)字段信息浦楣,損失便利性,能簡(jiǎn)單防止SQL注入攻擊
print('請(qǐng)輸入查詢條件咪辱!')
else:
return self.cur.execute('SELECT * FROM {} WHERE {} {} {}'.format(self.table, col, condition, search_x))
def closeDB(self):
self.db.close()
if __name__ == '__main__':
a = QuickSQL('abc.db', 'test')
a.create('a', 'b', 'c')
a.closeDB()
時(shí)間比較晚了振劳,調(diào)試的不多,發(fā)現(xiàn)BUG請(qǐng)多多指導(dǎo)~
Python SQLite3 API:https://docs.python.org/2/library/sqlite3.html