データベース操作(C)
1.Navicatツール
インストールがメインインターフェイスに開いた後、その後のNavicatツール]をダウンロードする公式サイトでは良いばかにショートカットをダブルクリックします。
mysqlクライアントとして、我々は、MySQLサーバを接続する必要があります
ポップアップインタフェース入力MySQLサーバーのIPアドレスとポートだけでなく、ユーザー名とパスワードMySQLで
照合について、私たちは、これら二つのブログを見て理解します:
https://www.cnblogs.com/adforce/p/3282404.html
https://www.jb51.net/article/48775.htm
データベースを構築し、上記の手順で[OK]をクリックします:
その後、我々は、データベース内に新しいテーブルの上に行ってきました
つまり、我々は、マウスをクリックすることで、対応するSQL文を生成するために実行するために行きます
[保存]をクリックします:
このテーブルが生成されます。
私たちは、コマンドラインを見てみることを行ってきました信じてはいけない:このテーブルには存在しています
我々は、直接コマンドライン操作が非常に煩雑であるため、その上にデータベースを操作するために、このツールを使用した後
その後、我々は、外部キーの確立を見て
その後、自動的に対応するSQL文を生成し、
[保存]をクリックし、テーブルから、テーブルがあります
そして、データを挿入することができ、上記の表の名前をダブルクリックします
それはidフィールドが自動インクリメントを行う方法となり作るために、のは、テーブルの上に私たちのidフィールドは、DEPの増分を設定されていない、私はそれを変更したいとしましょう
設計テーブル:
次に、どのようにそれをテーブルを削除してから再作成し、我々はそれを行うにはありますか?別の関連テーブルは、あなたは確かにあなたは、あなたが外部キー関係が関連付けられていることを最初の表は、キャンセル、または最初の外部キーテーブルを削除するためになる必要があることをやらないであろう
その後、外部キーが関連付けられたテーブルを削除し、保存します
我々は、DEPテーブルのidフィールドプラスインクリメントするIDフィールド内の増分というidフィールドを与えて保存し、再度DEPにemp表の外部キーにしたいです
DEPのデータテーブルには、いくつか挿入します
このツールはまた、あなたを表示するグラフィックスの形であなたのテーブル間の関係になります
ERダイアグラムをクリックして、両者の間のグラフは、その後、あなたのテーブルに多くの時間の未来は、あなたが結果を表示するには、このチャートを介して自分のテーブルとテーブル間の関係を見ることができます表示されます。
我々は2つのテーブル間のラインをクリックすると、我々は2つの間の関係を見ることができます:
また、テーブル間のリレーションシップを作成し、直接チャートを作成するには、上記のモデルを選択することができます
しかし、私たちが確立したこのモデルは、データベース内で直接作成することはできません、あなたはSQLの形でそれをインポートする必要があることは、その後、内部実行するSQL文をデータベースにエクスポートします
そして、場所を保存するエクスポート
我々は内部の何を見て、エクスポートされたファイルを開きます。
これは、これらのステートメントでSQL文、SQLレプリケーションに翻訳作成したモデルですが、mysqlはそれを実行するための内部で、我々は二つのテーブルの内部をモデル化するまで待つだけ、と非常に便利
Navicatのツールは、データベースを操作するためにネイティブのSQL文を書くことができます
SQL文の入力インタフェースを表示するには:
そして、SQL文を記述してみてください:
そして、それを実行します。
また、NavicatはでデータベースにSQLファイルの形式で、データのうち、データベース前に導くことができます。
まず、私たちは、新しいライブラリを作成します。
その後、右クリックして[ファイル名を指定して実行するSQLファイルを選択し、データベースを選択します。
上記のステップは、直接オフ、起動するには、再度クリックしないことに注意してください
その後、ER図では、非常にはっきりと見るために、各テーブル間の関係を見てみましょう。
2.pymysqlモジュール
pymysqlのMySQLは、Pythonの最後にクライアントソケットを実行している、Pythonで動作しています。
#安装
pip install pymysql
import pymysql
conn = pymysql.connect(
host = '127.0.0.1', #主机ip
port = 3306, #端口号
user = 'root', #用户名
password = '123', #密码
database = 'learn', #需要连接的库
charset = 'utf8')
cursor = conn.cursor() #游标相当于命令行的 mysql>
#cursor = conn.cursor(pymysql.cursors.DictCursor)
#默认游标取出的数据结构为元组类型即((),()...),DictCusor获取字典数据类型,对应的数据结构是[{},{}..]
sql = 'select * from dep;'
ret = cuosor.execute(sql) #ret为受影响的行数
print(ret)
print(cursor.fetchone()) #取出单条数据记录
print(cursor.fetchmany(3)) #取出多条,即取出3条数据记录
print(cursor.fetchall()) #取出全部数据记录
cursor.scroll(2,'absolute')
#absolute 绝对移动,相对于数据最开始的位置进行光标的移动
cursor.scroll(2,'relative')
#relative 相对移动,按照光标当前位置来进行光标的移动
conn.commit() #增删改都必须进行提交操作(commit)
cursor.close() #关闭游标
conn.close() #关闭连接
ps:
print(cursor.lastrowid) #获取插入的最后一条数据的自增ID
sql注入:
#我们来使用数据来进行一下用户名和密码的认证操作
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='666',
database='crm',
charset='utf8'
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
uname = input('请输入用户名:')
pword = input('请输入密码:')
sql = "select * from userinfo where username='%s' and password='%s';"%(uname,pword)
res = cursor.execute(sql) #行数受到影响则不为0,即True
print(res)
if res:
print('登陆成功')
else:
print('用户名和密码错误!')
#通过上面的验证方式,比我们使用文件来保存用户名和密码信息的来进行验证操作要方便很多。
但是
1.知道用户名不知道密码的情况下输入(asfdf为随意输入的字符)
uname:asfdf' --
pword:随意输入
发现也可以登陆成功,是利用了mysql中 -- 注释的方法修改了mysql指令
2.不知道用户名也不知道密码的情况下输入
uname:asfdf' or 1 =1 --
pword:随意输入
发现也可以登陆成功,是利用了注释加or运算修改了mysql指令
这就是mysql注入的问题,解决办法:
cursor.execute(sql,[参数1,参数2...])
即:
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='666',
database='crm',
charset='utf8'
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
uname = input('请输入用户名:')
pword = input('请输入密码:')
sql = "select * from userinfo where username='%s' and password='%s';"
res = cursor.execute(sql,[uname,pword]) #行数受到影响则不为0,即True
print(res)
if res:
print('登陆成功')
else:
print('用户名和密码错误!')