前述のように、ファイルまたは単純な永続ストレージは、一部の小さなアプリケーションのニーズを満たすことができますが、大規模なサーバーまたは大容量のアプリケーションには、より成熟したデータベースシステムが必要です。しかし、今こそビッグデータの時代です。リレーショナルデータに加えて、非リレーショナルデータベースもサポートされるため、パフォーマンスの利点を「スリーハイ」システムに反映させることができます。この記事では、主にPythonとリレーショナルデータベース(mysql)間の通信について説明します。
メインコンテンツ
1マスターへの技術的ポイント
2pymysqlのインストール
3pymysql.cursorsとpymysql.connectionsの概要
4簡単なCRUDケースの実装
技術的なポイントを習得する必要があります
1は、データベースsqlステートメントの基本概念の記述などを知るために、mysqlデータの基本操作である必要があります。理解していない場合は、ルーキーチュートリアルmysqlチュートリアルに進むことができ
ます。2Pythonベースの構文を知っている必要があります。結局のところ、データデータを処理するプログラムを作成するのはpymysqlPythonによるものです。
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を実行し、リソースを閉じるためのコードを作成する必要がある場合、それは間違いなく無理です。コードを再利用する方法については、後の更新を参照してください。ありがとうございました!