ディレクトリ
、Pythonの動作のmysql
PythonのMySQLのモジュールの動作によってpymysql、インストールする必要があり、方法:インストールpymysqlピップ
1.1python操作のmysql
ステップ:
1構成では、データベース接続パラメータ
ホストのIPアドレスが設定されている、マシンはRuoguoが、その後、ユーザー設定ユーザー権限をlocalhostを使用して、アカウントのパスワードを設定され、ここでパスワードはアカウントとパスワードのデータベースを参照するアカウント、データベース構成は、コンフィギュレーションが続くことを、データベースの操作が必要コード化されたリンクデータベース。
2.返されたデフォルトのデータ型を設定します。
3. SQLコマンドを送ります
4.返されたデータを取得します
import pymysql
#连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
#cursor = conn.cursor() 默认返回的是元组类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#默认返回字典类型
sql = "select * from userinfo"
cursor.execute(sql)
res1 = cursor.fetchone()#取出一条数据,返回的是字典
print(res1)
res = cursor.fetchall()#取出所有的数据,返回的是列表套字典
print(res)
cursor.close()
conn.close()
{'id': 1, 'name': 'xiaozhu', 'depart_id': 1}
[{'id': 2, 'name': 'xiaoyu', 'depart_id': 1}, {'id': 3, 'name': 'laohe', 'depart_id': 2}, {'id': 4, 'name': 'longge', 'depart_id': 2}, {'id': 5, 'name': 'ludi', 'depart_id': 3}, {'id': 6, 'name': 'xiaoguo', 'depart_id': 4}]
一例として見ることができるように、読み出しデータが一枚ずつ読み出されます。
1.2クエリデータ
PythonのMySQLのクエリ使用して単一のデータを取得するfetchone()メソッドのいずれかを使用して
fetchall()
:複数のデータを取得する方法。fetchone()
:次のメソッドは、クエリの結果セットを取得します。結果セットが対象ですfetchall()
:行の結果、すべての利益を受け取ります。- ROWCOUNT:これは、読み取り専用属性、およびリターン実行が影響を受けた行の数の()メソッドを実行します。
import pymysql
#连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
#cursor = conn.cursor() 默认返回的是元组类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#默认返回字典类型
sql = "select * from userinfo"
cursor.execute(sql)
res1 = cursor.fetchone()#取出一条数据,返回的是字典
print(res1)
res = cursor.fetchall()#取出所有的数据,返回的是列表套字典
print(res)
res2 = cursor.rowcount#返回的是int型,不能加括号
print(res2)
conn.commit()#对数据的增删改一定要提交,否则更改不成功,而且主键id还会增加,pycharm还不会报错,很坑
cursor.close()
conn.close()
1.3増加(追加、更新)データ
に使用します。
データを追加するcursor.execute()
cursor.executemany()データが増加する複数の
conn.commit()送られたSQL文を提出
変更のデータへの追加や削除は、そうでない場合は変更が成功しなかった、提出しなければならない、と主キーIDは、pycharmも文句はありません、非常にピットを増加します
インサート複数の行は、最後の行の正しいプライマリキーのIDを表示できない場合、印刷(cursor.lastrowid)は、最後の行のIDの値、オリジナルIDプラスワンの最後の行を取得します
例としては、データを挿入する1
import pymysql
#连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
#cursor = conn.cursor() 默认返回的是元组类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#默认返回字典类型
sql = "insert into user (name,password) values (%s,%s)"
cursor.execute(sql,('abc','deg'))#括号内填写需要增加的数据,此方式为增加一条数据
print(cursor.lastrowid)#获取最后一行的ID值
conn.commit()#对数据的增删改一定要提交,否则更改不成功,而且主键id还会增加,pycharm还不会报错,很坑
cursor.close()
conn.close()
mysql> select * from user;
+----+----------+----------+
| id | name | password |
+----+----------+----------+
| 2 | xiaoming | 1563sdi |
| 3 | abc | deg |
| 5 | abc | deg |
+----+----------+----------+
3 rows in set (0.00 sec)
挿入されたデータの2個の例
import pymysql
#连接数据库的参数
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
#cursor = conn.cursor() 默认返回的是元组类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#默认返回字典类型
data = [('xiaozhu1','145656'),('xiaohzhu2','14965'),('xiaozhu3','61500')]
sql = "insert into user (name,password) values (%s,%s)"
# cursor.execute(sql,('abc','deg'))#括号内填写需要增加的数据
cursor.executemany(sql,data)
print(cursor.lastrowid)#获取最后一行的ID值,只是将原来的最后一行id加一,
# 如果一次插入多行,并不能正确显示主键最后一行的id
conn.commit()#对数据的增删改一定要提交,否则更改不成功,而且主键id还会增加,pycharm还不会报错,很坑
cursor.close()
conn.close()
1.4データを変更
データを修正し、データを増加させる、データが実際に適切なSQL文に送信され、データベースにオブジェクトを変更し、その後、対応するデータベースステートメントで実行削除します。
import pymysql
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "update user set name=%s where id=%s"
cursor.execute(sql,('xiaoyu',2))
conn.commit()
cursor.close()
conn.close()
1.5データを削除します
= SQL "ユーザから削除する場合、ID =%sの"
import pymysql
conn = pymysql.connect(host='localhost',user='root',
password='123zgh',database='test2',
charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#sql = "update user set name=%s where id=%s"
sql = "delete from user where id=%s"
cursor.execute(sql,(1,))#这里的数据元组里面只有一个元素时不加逗号也可以正常删除,但是最好加上
conn.commit()
cursor.close()
conn.close()
1.6SQLインジェクションの問題
1.6.1の問題を導入しました
私たちは、ログインプログラムを書いたとき、私たちは、ユーザー名を入力してください:XXX「または= 1 1位mysqlコマンドに送信することができ、後の選択入力になったとして、ユーザーのデータを取得することができ、ユーザー名とパスワードを変更しません*名=「xiaozhu」または1 = 1#「とパスワードは=」156「の後に条件が戻って変更されたコメントは、パスワードセクションであるかの条件が常に真であるユーザから。
import pymysql
user = input('输入用户名:').strip()
pwd = input('输入密码:').strip()
conn = pymysql.connect(host='localhost',user='root',password='123zgh',
database='test2',
charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from user where name='%s' and password='%s'" % (user,pwd)
print(sql)
cursor.execute(sql)
# print(sql)
res = cursor.fetchall()
print(res)
cursor.close()
conn.close()
if res:
print('登录成功')
else:
print('登录失败')
1.6.2ソリューション
私たちは、ログインプログラムを書いている時に提供pymysqlを使用するか、または文字が問題になっているユーザーが入力したかどうかを判断するために、独自のプログラムを書くことができます。
SQL = "選択*ユーザーからどこ名=%sのパスワード=%sを"
cursor.execute(SQL、(ユーザー、PWD))
import pymysql
user = input('输入用户名:').strip()
pwd = input('输入密码:').strip()
conn = pymysql.connect(host='localhost',user='root',password='123zgh',
database='test2',
charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from user where name=%s and password=%s"
cursor.execute(sql,(user,pwd))
# print(sql)
res = cursor.fetchall()
print(res)
cursor.close()
conn.close()
if res:
print('登录成功')
else:
print('登录失败')
第二に、インデックス
MySQLと辞書インデックスにインデックス、図書館の本の役割の指標が同じで、その目的は、検索を高速化することです。
自然の2.1インデックス
インデックスは、データベースが検索速度データを向上させることができ、特殊なファイルである本質的です。
基本となるインデックスの原理2.2
基本原理は、B +ツリー(知識の関与複数のデータ構造とアルゴリズムは、プレゼンテーションを行う機会を持っている)であります
2.3分類インデックス
2.3.1主キー索引
主キーの検索データ、機能に基づいていた:検索効率を向上させ、主キーのデータを記録する空でない、繰り返されていません
2.3.2一意のインデックス
モードを追加:コラムプラスユニーク(フィールド)のデータ・タイプ・フィールド名の後に
特長:検索効率を向上させ、そして一意のインデックス記録されたデータは空ではない、繰り返されていません
2.3.3共同一意のインデックス
追加の方法:ユニーク(フィールド名1、フィールド名2 ......)
特長:検索効率を向上させ、そして結合されたデータは、記録フィールドを繰り返さない、空ではありません
2.3.4一般的な指標
インデックス(フィールド名)
特徴:メインのデータ要件のないユニークインデックスキー
2.3.5共同インデックス
インデックス(フィールド1、フィールド2 ......)
特徴:メインのデータ要件のないユニークインデックスキー
2.4インデックスの作成
2.4.1主キーのインデックスの作成と削除
2.4.1.1新しい主キーインデックス
方式1
create table xxx(
id int auto_increment primary key
);
方式2
create table xxx(
id int auto_increment, primary key(id)
);
方式3
alter table xxx change id id int auto_increment primary key;
方式4
alter table yyy add primary key (id);
2.4.1.2ドロッププライマリインデックス
alter table yyy drop primary key;
2.4.2一意のインデックスを作成および削除
2.4.2.1は、一意のインデックスを作成します
方式1
create table XXX(
id int auto_increment primary key,
name varchar(32) not null default '',
unique u_name (name) )
#u_name是给唯一索引起的名字,方便以后删除索引或查找问题
方式2
create unique index 索引名 on 表名 (字段名);
方式3
alter table 表名 add unique index 索引名(字段名)
2.4.2.2は、ユニークなインデックスを削除します
alter table 表名 drop index 索引名;
2.4.3一般的なインデックスの作成と削除
2.4.3.1は、通常のインデックスを作成します
方式1
create table 表名(
id int auto_increment primary key,
name varchar(32) not null default '',
index 普通索引名(字段名)
)
方式2
create index 索引名 on 表名(字段名);
方式3
alter table 表名 add index 索引名(字段名);
2.4.3.2通常のインデックスを削除します。
alter table 表名 drop index 索引名;
インデックス2.5の長所と短所
長所:クエリの速度をスピードアップ
短所は:ディスクスペースの多くを占める*の.ibdデータが格納されているインデックス付きのファイルは、あなたが前のサイズ比較により、インデックス作成された屈折率差を作成した後にファイルを表示することができます。
2.6は、インデックスケースをヒットしません。
2.6.1は、インデックスケースをヒットしません。
これは、人差し指をヒットしません。便利であるものに作成されたインデックスは、迅速な検索を実現していません。
ケース1
SQL文の4つの操作を使用して、SQLクエリは効率が低下します。
ケース2
SQLステートメントで関数を使用してください。として
select * from user where reverse(email) = 'guanghao';
#reverse的功能是反转'guanghao'然后在email里面查找
ケース3
矛盾のタイプ:列は文字列型である場合は、条件を引用符で渡されなければならない、または見つけることができませんでした。
ケース4
ソートされたインデックスは、その後、選択フィールドは、フィールドをインデックス化しなければならない、またはヒットすることはできません。
このような使用順序などによって
電子メールDESCにより、ユーザ注文から名前を選択します。
メールがインデックス化されている場合、あなたが見つけるためにインデックスを素早くメールを選択することができます上記のSQL文、行インデックスを選択しない場合は、インデックスがトリガされていない、検索速度はまだ非常に遅いです。
例外:主キーのソートであれば、他の列の検索条件、非常に高速。
このようなIDのDESCにより、テーブル名の順序から選択*として;
ケース5
検索速度はあまり違いはない(*)カウント、(列)をカウントし、(1)カウント
ケース6
複合インデックスは、最も左のプレフィックスの原則に従います
あなたが名前などの関節のインデックスを作成すると、メールがインデックスを作成している、あなたは、インデックスをヒットする方法を見つけることができます:
方式1
select * from user where name='guanghao' and email='[email protected]';
方式2
select * from user where name='guanghao';
条件はあなたがインデックスを打つことができない電子メールのバックである場合。
右に左から順に配置された二つ以上の列の共同指数は、真ん中には、インデックスを打つことができないの列をスキップした場合、彼らは、インデックスを打つことができる前に見つける必要があります場合。次の例
index(a,b,c,d)
where a=1 and b=2 and c=3 and d=4 #命中索引
where a=1 and c=3 and d=4 #未命中索引
2.6.2チェックするかどうか、インデックスヒット方法
explain select * from 表名 where 查询的条件\G;
如:
mysql> explain select password from user where id=6\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
type: const
possible_keys: PRIMARY 可能用到的索引
key: PRIMARY 确实用到的索引
key_len: 4 索引长度
ref: const
rows: 1 扫描的长度(这里可以确定是否使用了索引)
Extra: NULL 是否使用了索引
1 row in set (0.00 sec)
2.6.3インデックス・カバーリング
インデックス・カバーリングは、データをチェックするための指標に従ったものです。
2.7スロークエリログ
2.7.1 SQLビュー遅い関連する変数
mysql> show variables like '%slow%';
+---------------------------+---------------------------------------------------+
| Variable_name | Value |
+---------------------------+---------------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF 慢日志查询是默认关闭状态 |
| slow_query_log_file | E:\mysql\mysql-5.6.46-winx64\data\ZGH-PC-slow.log |记录慢日志的位置,
+---------------------------+---------------------------------------------------+可配置
5 rows in set (0.03 sec)
mysql> show variables like '%long%';
+--------------------------------------------------------+-----------+
| Variable_name | Value |
+--------------------------------------------------------+-----------+
| long_query_time | 10.000000 |
默认当查找时间大于10秒会记录为慢SQL,我们需要对其进行配置修改其记录为慢SQL的时间。
2.7.2遅いSQL構成変数
set global 变量名 = 值
set global slow_query_log = on;慢日志查询配置为on
set global slow_query_log_file="D:/mysql-5.6.46/data/myslow.log";配置慢日志存储路径
set global long_query_time=1;配置记录为慢日志的捕捉时间