このセクションの内容
- データベース操作
- パッケージのデータベース操作
序文
機能において、インターフェース・テストは、多くの場合、データベース操作インターフェイスが正しい、データ、テストおよび検証環境機能を調製するために、データベースの操作で必要とされます。
自動テストでは、我々は、データベースのデータの準備、環境検査データベースアサーション機能に接続し、自動的にコードを使用する必要があります。
ここで、我々は三者のライブラリを使用する必要があるのPythonを使用してMySQLデータベース操作PyMySQl
インストール:
pip install pymysql
データベース操作
- データベース接続を確立します
conn = pymysql.connect()
- コネクション確立動作からカーソル
cur = conn.cursor()
- SQLを実行するには、カーソルを使用します(読み取り/書き込み)
cur.execute(sql)
- (読み取り)の結果を取得/変更(書き込み)を提出
cur.fetchall()
/conn.commit()
- カーソルとの接続を閉じます
cur.close();conn.close()
import pymysql
# 1. 建立连接
conn = pymysql.connect(host='127.0.0.1',
port=3306,
user='root', passwd='123456', # password也可以 db='api_test', charset='utf8') # 如果查询有中文需要指定数据库编码 # 2. 从连接建立游标(有了游标才能操作数据库) cur = conn.cursor() # 3. 查询数据库(读) cur.execute("select * from user where name='张三'") # 4. 获取查询结果 result = cur.fetchall() print(result) # 3. 更改数据库(写) cur.execute("delete from user where name='李四'") # 4. 提交更改 conn.commit() # 注意是用的conn不是cur # 5. 关闭游标及连接 cur.close() conn.close()
カーソルとは何ですか?同様にファイルハンドルをカーソルは、結果セットのいずれかでデータベースにアクセスすることができます。pymysqlは、SQLを実行し、カーソルを使用して結果を得ることができます
クエリ
データベースクエリを実行した後、cur.execute()を使用してではなく、その結果より、行の数に影響を返しません。私たちは、使用したいcur.fetchone()/cur.fetchmany()/cur.fetchall()
結果を得るために
- cur.fetchoneは():データを取得し(同時に取得されたデータは、結果セットから削除されます)、元祖を返します
('张三','123456')
- cur.fetchmany(3):複数のデータを取得し、ネスティング祖先
(('张三','123456'),('李四','123456'),("王五","123456"))
- cur.fetchall():すべてのデータ、ネストのタプルを取得し、
(('张三','123456'),)
(一つだけのデータ)
注意:データを取得した後、データを集中管理、データ収集から削除され、再度のような、あまり得られます。
cur.execute(select * from user where name='张三')
print(cur.fetchone()) # 结果: ('张三','123456')
print(cur.fetchone()) # 结果:None print(cur.fetchall()) # 结果:()
だから我々は、クエリ結果を再利用する必要がある、クエリの結果が変数に代入する必要があります
cur.execute(select * from user where name='张三')
result = cur.fetchall()
print(result) # 结果: ('张三','123456')
print(result) # 结果: ('张三','123456')
操作変更
操作は、接続が使用してデータベースを変更を行った直後に有効になりませんconn.commit()
コミットとサポート物事をロールバックするまで反映を
try:
cur.execute("insert into user (name,password) values ('张三', '123456')")
cur.execute("insert into user (name, passwd) values ('李四'), '123456'") # 此处sql出错
conn.commit() # 使用连接提交所有更改 except Exception as e: conn.rollback() # 回滚所有更改(注意用的是conn) print(str(e))
パッケージのデータベース操作
多くの場合、データベースに使用しているので、すべてのデータベース操作が共通のデータベースモジュールにパッケージ化することをお勧めします
- 新db.py、コードは次のように:
import pymysql
# 获取连接方法
import pymysql
# 获取连接方法
def get_db_conn(): conn = pymysql.connect(host='127.0.0.1', port=3306, user='test', passwd='123456', db='api_test', charset='utf8') # 如果查询有中文,需要指定测试集编码 return conn # 封装数据库查询操作 def query_db(sql): conn = get_db_conn() # 获取连接 cur = conn.cursor() # 建立游标 cur.execute(sql) # 执行sql result = cur.fetchall() # 获取所有查询结果 cur.close() # 关闭游标 conn.close() # 关闭连接 return result # 返回结果 # 封装更改数据库操作 def change_db(sql): conn = get_db_conn() # 获取连接 cur = conn.cursor() # 建立游标 try: cur.execute(sql) # 执行sql conn.commit() # 提交更改 except Exception as e: conn.rollback() # 回滚 finally: cur.close() # 关闭游标 conn.close() # 关闭连接 # 封装常用数据库操作 def check_user(name): # 注意sql中''号嵌套的问题 sql = "select * from user where name = '{}'".format(name) result = query_db(sql) return True if result else False def add_user(name, password): sql = "insert into user (name, passwd) values ('{}','{}')".format(name, password) change_db(sql) def del_user(name): sql = "delete from user where name='{}'".format(name) change_db(sql)
データベースを直接操作するSQLの実施形態と比較すると、パッケージの一般的なデータベース操作をより安全
- (他のモジュール)メソッドを呼び出します
from db import *
if check_user("张三"):
del_user("张三")
注:別のパッケージ方法
上記本実装方法は、各データベースクエリはあまり効率的な接続を確立するため、また、パッケージングのオブジェクト指向の方法の下に使用することができます
db2.py
import pymysql
class DB:
def __init__(self): self.conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', # passwd 不是 password db='api_test') self.cur = self.conn.cursor() def __del__(self): # 析构函数,实例删除时触发 self.cur.close() self.conn.close() def query(self, sql): self.cur.execute(sql) return self.cur.fetchall() def exec(self, sql): try: self.cur.execute(sql) self.conn.commit() except Exception as e: self.conn.rollback() print(str(e)) def check_user(self,name): result = self.query("select * from user where name='{}'".format(name)) return True if result else False def del_user(self, name) self.exec("delete from user where name='{}'".format(name))
使用
from db2 import DB:
db = DB() # 实例化一个数据库操作对象
if db.check_user("张三"): db.del_user("张三")
言葉の後
- 勧告を記述されたデータベース接続情報の設定ファイル、設定ファイルから読み込みます
- 手動テストにパッケージそれ以上の文法を見ないことをお勧めしSQL文
- 様々な動作は、様々なサービスSQLをカプセル化することによって達成することができます
- リスクのあるデータベースを変更し、操作は慎重にする必要があります!!!