python-pymysql(11)

前述のように、ファイルまたは単純な永続ストレージは、一部の小さなアプリケーションのニーズを満たすことができますが、大規模なサーバーまたは大容量のアプリケーションには、より成熟したデータベースシステムが必要です。しかし、今こそビッグデータの時代です。リレーショナルデータに加えて、非リレーショナルデータベースもサポートされるため、パフォーマンスの利点を「スリーハイ」システムに反映させることができます。この記事では、主にPythonとリレーショナルデータベース(mysql)間の通信について説明します。

メインコンテンツ

1マスターへの技術的ポイント
2pymysqlのインストール
3pymysql.cursorsとpymysql.connectionsの概要
4簡単なCRUDケースの実装

技術的なポイントを習得する必要があります

1は、データベースsqlステートメントの基本概念の記述などを知るために、mysqlデータの基本操作である必要があります。理解していない場合は、ルーキーチュートリアルmysqlチュートリアルに進むことができ
ます。2Pythonベースの構文を知っている必要があります結局のところ、データデータを処理するプログラムを作成するのはpymysqlPythonによるものです。

pymysqlをインストールします

pymysqlインストールの詳細な説明

pymysql.connections

オブジェクト指向の世界では、すべてがオブジェクトです。接続は、アプリケーションとデータベース間の通信のためにデータベース接続を確立する必要性を表します。これは最も基本的なメカニズムであり、データベース接続を介してのみコマンドをサーバーに渡し、返された結果を取得できます。接続(または接続プール)が確立されると、カーソルを作成し、データベースに要求を送信してから、データベースから応答を受信できます。
接続クラスの一般的なメソッドの詳細な説明:

メソッド名 説明
閉じる() データベース接続を閉じる
コミット() 現在のトランザクションをコミットします
rollback() 現在のトランザクションをキャンセルします
カーソル() この接続を使用して、カーソルまたはカーソルのようなオブジェクトを作成(および返す)します
エラーハンドラー(cxn、cur、errcls、errval) 特定の接続のカーソルのハンドラーとして

pymysql.cursors

カーソルカーソルを使用すると、ユーザーはデータベースコマンドを送信して、クエリの結果を取得できます。

カーソルクラスの一般的なメソッドの詳細な説明

メソッド名または属性 説明
arraysize fetchmany()メソッドを使用する場合、一度にフェッチされる結果行の数。デフォルトは1です。
接続 このカーソルの接続を作成します(オプション)
説明 カーソルアクティビティの状態を返します(7項目のタプル):( name、type_code、display_size、internal_ size、precision、scale、null_ok)、nameとtype_codeのみが必要です
lastrowid 最後に変更された行の行ID(オプション。行IDがサポートされていない場合は、Noneが返されます)
行数 最後のexecute *()メソッドによって処理または影響を受けた行の数
callproc(func [、args]) ストアドプロシージャを呼び出す
閉じる() カーソルを閉じる
実行(op [、args]) データベースクエリまたはコマンドを実行します
executemany(op、args) execute()とmap()の組み合わせと同様に、指定されたすべてのパラメーターに対してデータベースクエリまたはコマンドを準備して実行します。
fetchone() クエリ結果の次の行を取得します
fetchmany([size =cursor。arraysize]) クエリ結果の次のサイズの行を取得します
fetchall() クエリ結果のすべての(残りの)行を取得します
iter() カーソルのイテレータオブジェクトを作成します(オプション、next()を参照)
メッセージ カーソルの実行後にデータベースから取得されたメッセージのリスト(タプルセット、オプション)
次 () クエリ結果の次の行を取得するためにイテレータによって使用されます(オプション、fetchone()と同様、__ iter __()を参照)
nextset() 次の結果セットに移動します(サポートされている場合)
行番号 現在の結果セット内のカーソルのインデックス(0から始まる行単位、オプション)
setinputsizes(sizes) 許可される最大入力サイズを設定します(必須ですが、実装はオプションです)
setoutputsize(size [、col]) 大きな列の最大バッファーサイズを設定します(必須ですが、実装はオプションです)

単純なCRUDケースを実装する

クエリデータ

import  pymysql
#获取连接对象
connection = pymysql.connect("localhost","root","root","users",charset="utf8")
#通过连接对象获取游标
cursor = connection.cursor()
#操作数据
sql = "select * from my_user"
cursor.execute(sql)
#返回影响的行数
#print(cursor.rowcount)

#获取查询数据
#fetchone 获取单条数据   返回是元组类型
# result = cursor.fetchone()
# for message in result:
#     print(message)

#获取全部数据
for  id,name,address,sex,phone,age,pw in cursor.fetchall():
    print(id,name,address,phone,age,pw)

#带参数查询
#操作数据   (查询id= 3  这条记录)
#================1 参数和写死在str中====================
#   sql = "select * from my_user where u_id = 3"
#cursor.execute(sql)

#=============2 str动态拼接=  (解决不了sql注入问题)====================
# sql = "select * from my_user where u_id = %d " % (4)
# cursor.execute(sql)

#=======3  通过cursor.execute(sql,arge) 参数来实现=====(可以解决sql注入问题)==============
sql = "select * from my_user where u_id = %s "
cursor.execute(sql,[4])

#关闭资源
cursor.close()
connection.close()

SQLインジェクションの問題

#sql注入问题
import  pymysql
#获取连接对象
connection = pymysql.connect("localhost","root","root","users",charset="utf8")
#通过连接对象获取游标
cursor = connection.cursor()


name = "'admin' or 1=1 -- "
pw = "123"

#=============2 str动态拼接=  (解决不了sql注入问题)====================
# sql = "select * from my_user where u_name=%s and u_password=%s" % (name,pw)
# cursor.execute(sql)

#=======3  通过cursor.execute(sql,arge) 参数来实现=====(可以解决sql注入问题)==============
sql = "select * from my_user where u_name=%s and u_password=%s"
cursor.execute(sql,[name,pw])


#fetchone 获取单条数据   返回是元组类型
print(cursor.fetchone())

#关闭资源
cursor.close()

データを挿入

import  pymysql
# 1 Connection 连接  事务 默认是手动提交
message ={"host":"localhost","user":"root","password":"root","database":"test","charset":"utf8"}
connection  =  pymysql.connect(**message)
# 2 通过connectin对象获取游标
cursor = connection.cursor()
#3  执行语句
#sql ="insert into dept values (null,'研发')"
#添加动态的数据,但是避免不了sql注入
sql ="insert into dept values (null,'%s')" % "行政"
#print(sql)
#添加动态的数据 可以防止sql注入
#sql ="insert into dept values (null,%s)"
#print(sql)
#print(cursor.execute(sql,["人事"]))
print(cursor.execute(sql))
#手动提交事务
connection.commit()
#关闭数据连接
cursor.close()
connection.close()

データを削除する

# pymysql 连接数据(删除数据)
import  pymysql

#根据地址 ,端口  ,用户  密码,获取连接
message= {"host":"localhost","user":"root","password":"root","database":"test","charset":"utf8"}
#connection = pymysql.connect("localhost","root","root","test")
connection = pymysql.connect(**message)
# 通过连接对象 去获取游标对象  (执行sql)
cursor = connection.cursor()

sql = "delete from myuser where u_id =%s"
#cursor.execute(sql,["李四2","深圳市xx","男",22,12121])
number = cursor.execute(sql,[70])
print(number)
#提交事务
connection.commit()
#关闭资源
cursor.close()
connection.close()

データを変更する

# pymysql 连接数据(修改数据)
import  pymysql

#根据地址 ,端口  ,用户  密码,获取连接
message= {"host":"localhost","user":"root","password":"root","database":"test","charset":"utf8"}
#connection = pymysql.connect("localhost","root","root","test")
connection = pymysql.connect(**message)
# 通过连接对象 去获取游标对象  (执行sql)
cursor = connection.cursor()

sql = "update myuser set u_name=%s where  u_id=%s"
#cursor.execute(sql,["李四2","深圳市xx","男",22,12121])
number = cursor.execute(sql,["张三2",70])
print(number)
#提交事务
connection.commit()
#关闭资源
cursor.close()
connection.close()

操作を実行するたびに接続を取得し、SQLを実行し、リソースを閉じるためのコードを作成する必要がある場合、それは間違いなく無理です。コードを再利用する方法については、後の更新を参照してください。ありがとうございました!

おすすめ

転載: blog.csdn.net/yipianfeng_ye/article/details/82761105