完全な動作イルpymysql

pymysql:PythonのMySQLの操作

pymysqlは何ですか?

pymysqlモジュールはPythonのMySQLの操作データに接続されています。彼なしで私たちは、MySQL接続のインストールではないので、することができます...

インストール

>: pip3 install pymysql

カーソルカーソルとは何ですか?

カーソル(カーソル)が処理しているデータを参照するために、方法、またはプロセスのを結果セット、データの前方または後方結果ブラウジングデータにカーソルを1行または複数行の焦点を合わせる能力を提供します。

pymysql.cursors.DictCursorを設定し、クエリの結果は辞書で、キーテーブルの列

文法

conn.commit()提出
conn.cursor(pymysql.cursors.DictCursor)がセットカーソルがオブジェクト
cursor.execute(SQL)の構文のSQL文の実行
conn.cursor(pymysql.cursors.DictCursor)はDictCursorセット
フェッチフェッチ特別
クエリ操作はfetchone必要
fetchmany(番号)
すべて)(またはfetchAllのを

CRUD

あなたはCRUD前に、独自のデータベースを作成する必要があります

# 选取操作的模块 pymysql

# pymysql连接数据库的必要参数:主机、端口、用户名、密码、数据库
# 注:pymysql不能提供创建数据库的服务,数据库要提前创建
import pymysql
from pymysql.cursors import DictCursor
# 1)建立数据库连接对象 conn  就可以创建sql的游标对象
# 2)通过 conn 创建操作sql的 游标对象理:结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。
# 3)编写sql交给 cursor 执行
# 4)如果是查询,通过 cursor光标对象 获取结果  
# 5)操作完毕,端口操作与连接


# 1)建立数据库连接对象 conn
conn = pymysql.connect(user='root', passwd='root', database='oldboy')
# conn = pymysql.connect(user='root', passwd='root', database='oldboy', autocommit=True)

# 2)通过 conn 创建操作sql的 游标对象
# 注:游标不设置参数,查询的结果就是数据元组,数据没有标识性
# 设置pymysql.cursors.DictCursor,查询的结果是字典,key是表的字段
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 3)编写sql交给 cursor 执行

sql5 = 'select * from t1'
row = cursor.execute(sql5)  # 返回值是执行语句的行数
print(row)
テーブルを作成します。
# 创建表
sql1 = 'create table t1(id int, x int, y int)'
cursor.execute(sql1)
増加
sql2 = 'insert into t1 values(%s, %s, %s)'

# 增1
cursor.execute(sql2, (1, 10, 100))
cursor.execute(sql2, (2, 20, 200))
# 重点:在创建conn对象时,不设置autocommit,默认开启事务,增删改操作不会直接映射到数据库中,
# 需要执行 conn.commit() 动作
conn.commit()

# 增多
cursor.executemany(sql2, [(3, 30, 300), (4, 40, 400)])
conn.commit()
delete删
sql3 = 'delete from t1 where id=%s'
cursor.execute(sql3, 4)
conn.commit()
アップデート改

sql4 = 'update t1 set y=666 where id=2'
cursor.execute(sql4)
conn.commit()
フェッチください

sql5 = 'select * from t1'
row = cursor.execute(sql5)  # 返回值是执行语句受影响的行数
print(row)

# 4)如果是查询表内记录,通过 cursor对象 获取结果
# fetchone() 偏移一条取出,fetchmany(n) 偏移n条取出,fetchall() 偏移剩余全部
r1 = cursor.fetchone()
print(r1)
r2 = cursor.fetchone()
print(r2)
r3 = cursor.fetchmany(1)
print(r3)
r4 = cursor.fetchall()
print(r4)
# 5)操作完毕,端口操作断开连接
cursor.close()
conn.close()

カーソル操作

import pymysql
from pymysql.cursors import DictCursor

# 1)建立数据库连接对象 conn
conn = pymysql.connect(user='root', passwd='root', db='oldboy')
# 2)通过 conn 创建操作sql的 游标对象
cursor = conn.cursor(DictCursor)
# 3)编写sql交给 cursor 执行
sql = 'select * from t1'
# 4)如果是查询,通过 cursor对象 获取结果
row = cursor.execute(sql)
if row:
    r1 = cursor.fetchmany(2)
    print(r1)

    # 操作游标
    # cursor.scroll(0, 'absolute')  # absolute绝对偏移,游标重置,从头开始偏移
    cursor.scroll(-2, 'relative')  # relative相对偏移,游标在当前位置进行左右偏移

    r2 = cursor.fetchone()
    print(r2)

# 5)操作完毕,端口操作与连接
cursor.close()
conn.close()

pymysql総務

彼の安全を保証するために
ロジックを書くことにします

そうである場合、転送は、彼らが成功したデータベースの両方を提出する前に検出されなければなりません

import pymysql
from pymysql.cursors import DictCursor
conn = pymysql.connect(user='root', passwd='root', db='oldboy')
cursor = conn.cursor(DictCursor)

try:
    sql = 'create table t2(id int, name char(4), money int)'
    row = cursor.execute(sql)
    print(row)
except:
    print('表已创建')
    pass

# 空表才插入
row = cursor.execute('select * from t2')
if not row:
    sql = 'insert into t2 values(%s,%s,%s)'
    row = cursor.executemany(sql, [(1, 'tom', 10), (2, 'Bob', 10)])
    conn.commit()


# 可能会出现异常的sql
"""
try:
    sql1 = 'update t2 set money=money-1 where name="tom"'
    cursor.execute(sql1)
    sql2 = 'update t2 set moneys=money+1 where name="Bob"'
    cursor.execute(sql2)
except:
    print('转账执行异常')
    conn.rollback()
else:
    print('转账成功')
    conn.commit()
"""

try:
    sql1 = 'update t2 set money=money-1 where name="tom"'
    r1 = cursor.execute(sql1)
    sql2 = 'update t2 set money=money+1 where name="ruakei"'  # 转入的人不存在
    r2 = cursor.execute(sql2)
except:
    print('转账执行异常')
    conn.rollback()
else:
    print('转账没有异常')
    if r1 == 1 and r2 == 1:
        print('转账成功')
        conn.commit()
    else:
        conn.rollback()

SQLインジェクション

SQLインジェクションとは何ですか?

目的カンニング悪意のあるコマンドを実行するには、最終的にSQL Serverの。

何であります

SQLインジェクションは、SQLコマンドは、クエリ文字列または入力ドメイン名またはページ要求提出Webフォームを介して挿入されます

どのように達成するために

自分のスプライシングパラメータの前提は、プレースホルダ
のユーザー名を知っている
ノートを使用して、「
知らない
プロパティの使用をか
に注意を払う
私たちは、SQLインジェクションを持たなければならないときに、自分のスプライシングパラメータ、pymysqlにプレースホルダのデータを記入します

詳細コード


import pymysql
from pymysql.cursors import DictCursor
conn = pymysql.connect(user='root', passwd='root', db='oldboy')
cursor = conn.cursor(DictCursor)

try:
    sql = 'create table user(id int, name char(4), password char(6))'
    row = cursor.execute(sql)
    print(row)
except:
    print('表已创建')
    pass

# 空表才插入
row = cursor.execute('select * from user')
if not row:
    sql = 'insert into user values(%s,%s,%s)'
    row = cursor.executemany(sql, [(1, 'tom', '123'), (2, 'bob', 'abc')])
    conn.commit()



# 用户登录
usr = input('usr: ')
pwd = input('pwd: ')

# 自己拼接参数一定有sql注入,将数据的占位填充交给pymysql

"""
sql = 'select * from user where name="%s" and password="%s"' % (usr, pwd)
row = cursor.execute(sql)
if row:
    print('登录成功')
else:
    print('登录失败')
"""
sql = 'select * from user where name=%s and password=%s'
row = cursor.execute(sql, (usr, pwd))
if row:
    print('登录成功')
else:
    print('登录失败')


# 知道用户名时
# 输入用户时:
#   tom => select * from user where name="tom" and password="%s"
#   tom" # => select * from user where name="tom" #" and password="%s"

# 不自定义用户名时
#   " or 1=1 # => select * from user where name="" or 1=1 #" and password="%s"

指数

キー - 指数が鍵

キーはやってするために使用されています

1)データベーステーブルのキーフィールドに追加される
キーテーブルを作成する)2、表は、パラメータテーブル構造、テーブルデータ、及びキー構成図のB +意志

短所

1)コンフィギュレーションキーは、維持するように長い構造図を維持しなければならないキーフィールドが影響しているように、追加データ、変更操作を削除が完了している
ボタンを追加し、効率が低下削除されます作成された後、変更を
2)キーは大幅に)クエリ(開発ニーズ、ほぼすべてのビジネスのスピードアップとの関係を確認することができます

設立の方法

主キー、外部キー、ユニークキー、インデックス:キーの方法を確立します

詳細コード



import pymysql
from pymysql.cursors import DictCursor
conn = pymysql.connect(user='root', passwd='root', db='oldboy')
cursor = conn.cursor(DictCursor)

# 创建两张表
# sql1 = """create table a1(
#     id int primary key auto_increment,
#     x int,
#     y int
# )"""
# cursor.execute(sql1)
# sql2 = """create table a2(
#     id int primary key auto_increment,
#     x int,
#     y int,
#     index(x)
# )"""
# cursor.execute(sql2)

# 每个表插入5000条数据
# import random
# for i in range(1, 5001):
#     x = i
#     y = random.randint(1, 5000)
#     cursor.execute('insert into a1(x, y) values(%s, %s)', (x, y))
#     cursor.execute('insert into a2(x, y) values(%s, %s)', (x, y))
#
# conn.commit()

import time
# a1的x、a1的id、a2的x
b_time = time.time()
sql = 'select * from a1 where id=4975'
cursor.execute(sql)
e_time = time.time()
print(e_time - b_time)

b_time = time.time()
sql = 'select * from a1 where x=4975'
cursor.execute(sql)
e_time = time.time()
print(e_time - b_time)

b_time = time.time()
sql = 'select * from a2 where x=4975'
cursor.execute(sql)
e_time = time.time()
print(e_time - b_time)

おすすめ

転載: www.cnblogs.com/jhpy/p/11600891.html
おすすめ