ローカル、josnデータフォーマット、MySQLとのRedisへの転送から文書を棚上げする準備ができて、自分自身を変更するには、最近、小さなスクリプト。
もともとSHHすることにより、サーバはログイン、私はいくつかの数字の上に、不安を恐れて、私のMySQLのパスワードを設定するMySQLの外部ネットワークポートを開く必要はありません。
私は情報を確認し、Pythonは、サードパーティのモジュールsshtunnelのsshログインがあります
これは私の参照リンクされます。https://www.cnblogs.com/luyingfeng/p/6386093.html
私の最初のフルページをコピー。
安全上の理由から、データベースへのアクセスは、主に行うために制限されているので、直接の問題がある(たとえば、独自のローカルなど)他のマシンでは、時間の最も頻繁にあり、日常的に使用するため、データベースにアクセスすることはできません大きな原因となりました不便。私は、任意のマシンは、ホワイトリストデータベース内のテーブルの上にマシンにSSH、その後、データベースにアクセスできることを期待して、需要をした数日前にそう。
人によって推奨、sshtunnelと呼ばれるクエリツールは、データベースのログを記録したいマシンにインストールする必要があります。
sshtunnelの基本的な導入: http://sshtunnel.readthedocs.io/en/latest/?badge=latest
図2のこの側面は、我々だけで、リモートサーバー上のデータベースを記載しているだけ一緒に別のサーバにアクセスすることができますが、私たちは、このサーバーにローカルのsshを必要とする場面であります
しかし、内部の私たちが必要なもの、関連するサーバーに関連するコード、リモート接続サーバは、リモート・データベース・サーバーであり、このさは、あまりにも、それだけの後半部分のコードを変更する必要があります。
これは、以下の元のコードです:
1つのインポートparamiko
2 sshtunnelからインポートSSHTunnelForwarder 3 4 SSHTunnelForwarderと(図5(REMOTE_SERVER_IP、443 )、6 ssh_username = "" 、7 ssh_pkey = " / VAR / SSH / rsa_key " 、8はssh_private_key_password = " 秘密" 、9 remote_bind_address =(PRIVATE_SERVER_IP 、22 )、10 local_bind_address =(' 0.0.0.0 '、10022 )11 )トンネルのような:12クライアント= paramiko.SSHClient()13client.load_system_host_keys()14 client.set_missing_host_key_policy(paramko.AutoAddPolicy())15 client.connect(' 127.0.0.1 '、10022 )16の#がクライアントセッションでいくつかの操作を行い17 (client.close)18 19 プリント(「FINISH!「)
MySQLのデータベース接続
:MySQLデータベースに接続する場合、インターネットは、プログラマが達成されている見た Pythonモジュールは、SSHトンネルを介してのMySQLdbのMySQLを使用して接続されています。
コードは以下の通りであります:
1 インポートのMySQLdb
2 sshtunnelからインポートSSHTunnelForwarder 。3 。4 SSHTunnelForwarderと(図5(' sshhost.domain.com '、22)と、#1 機のB構成。6 ssh_password = " sshpasswd " 、7 = ssh_username " sshusername " 、8 remote_bind_address =(' mysqlhost.domain.com 」、mysql.port))サーバーAS: #マシン構成。9 10コネティカット= MySQLdb.connect(ホスト= ' 127.0.0.1 '、 #ここではイエス127.0.0.1なければなりません11ポート= server.local_bind_port、12ユーザー= ' ユーザ' 、13のpasswd = ' パスワード' 、14デシベル= ' DBNAME ')
その後、次のクエリ、そこエッジに直接書き込み、およびCONN ALIGNそれは何ですか。
私にとっては、挿入、削除、更新、クエリ、他のデータベースが、そうではなく、一緒にしばしば私たちは、多くの場合、別の関数では、データベースのこの部分に接続されているので、それは、ここに問題があるの特徴があるようで、他の機能が使用されていない、オブジェクトが敵を破壊され、この範囲を残し、それはケースが接続されているであろうが、オブジェクトの破壊は、発した場合、クエリの結果を直接OperationalErrorを::このエラーを表示し(2006年、「MySQLサーバが立ち去りました」)、およびオンラインこの間違いをチェックし、多くの人がいるため、時間のクエリのSQL操作が長すぎる、またはデータ転送が大きすぎると言ったが、私の場所は、結果としてでスコープ外に実際にあるので、接続が閉じられ、この結果ので、出ました。
などとでは、書かれたエッセイは非常に詳細な。Pythonの構文の理解...と...
私は上のコードを入れた後、sshはGETはサーバーへのオブジェクトのうち、割り当てSSHTunnelForwarderとして、対応するコードのビュー内部sshtunnel文書のような、を排除し、サーバーを起動し、一連の操作を実行していること、そしてオフに停止します。
もともと私たちは別の関数を作成し、データベース接続、直接の後に変更してもうまくこの機能に配置されたが、オリジナルのconnect文を交換してください。
1 DEF 接続(自己):
2 ''」 3 self.client = MySQLdb.connect(ホスト= self.server、ポート= self.port、ユーザ= self.user、4 のpasswd = self.password、DB = self.database 、5 文字セット= self.charset)6 #log.info( 'MySQLサーバに接続します' + self.server)7 ''」8 9サーバ= SSHTunnelForwarder(10(' sshhost.domain.com '、22)、 #B机器的配置11 ssh_password = ' ssh_password ' 、12 ssh_username = ' ssh_username ' 、Remote_bind_address = 13である(' mysqlhost.domain.com ' 、mysql.port)14 )15 server.start()16 。17 self.client = MySQLdb.connect(ホスト= ' 127.0.0.1 、' #ここでなければならないはい127.0。 0.1 18ポート=であるserver.local_bind_port、19 =ユーザー' ユーザ名' 、20のpasswd =である' パスワード' 、21はDB =である' DBNAME ')
その後self.clientで、ときに、データベースのような最初の接続ルック更新または削除操作への問い合わせを行います。
SQLServerデータベース接続
mysqlのと一致しますが、データベースは、その後、この場所は私がピット、I完成のSQLServer Romのデータベースを踏んで接続した後、どのように言うことのようにも、それにpymssql.connectが、それデシベル、SQLServerのが注目されるべきです唯一の問題は、私はそれを更新した後、地元のSQLServerの新しいバージョンを発見します。それは常に感じピットであります
上記の原作者は書いています。実際には、このモジュールはもともと中間サーバを介してターゲットサーバにログインしました。しかし、私の中間サーバは、ターゲット・サーバーです。
pymysqlインポート sshtunnelインポートSSHTunnelForwarderから クラスDataBaseHandleは: '' '' 'MySQLの操作クラス定義' DEF __init __(自己、ホスト= '127.0.01'、ユーザ名= 'XXX'、パスワード= 'XXX' 、データベース= 'XXX' 、ポート= 10022): '' 'と、データベース接続を初期化するための情報のデータベースを作成する' '' self.w_server = SSHTunnelForwarder( #中間サーバアドレス ( "xxx.64.47.xxx"、22である)、 ssh_username = "XXX"、 ssh_pkey = " 〜/ .ssh / id_rsaと" #ssh_private_key_password ="の〜/ .ssh / id_rsaと」、 アドレスとポート#ターゲット、ターゲットアドレスは、中間アドレスであるため、書き込み127.0.0そう。1又はローカルホスト remote_bind_address =( '127.0.0.1'、3306)、 #ローカルアドレスとポート = local_bind_address( '0.0.0.0'、10022) ) #sshを開始たとえば、MySQLのその後のネットワーク接続は、この環境で実行されています。 self.w_server.start() #MySQLのデータは、後に初期化を開始 self.host =ホスト self.username =ユーザ名 self.password =パスワード self.database =データベース self.port =ポート self.db = pymysql.connect(ホストをself.host =、 ユーザー= self.username、 パスワード= self.password、 データベース= self.database、 ポート= self.port、 文字セット= 'UTF8') #ここでは、オブジェクトのインスタンスへの注釈方法の接続は、接続を作成します。別の治療に接続することが可能。 # #DEF connDataBase(自己): #'' 'データベース接続' '' # #self.db = pymysql.connect(self.host、self.username、self.password、self.port、self.database) # ## = self.db.cursor self.cursor() #1 #リターンself.db DEF insertDB(セルフ、SQL): '' 'データベース操作への' '' self.cursor = self.db.cursor() のtry: #は、SQLを実行します self.cursor.execute(SQL) #TT = self.cursor.execute(SQL)#戻りデータの数を挿入することができる戻り値は、処理結果に応じて決定 (TT)印刷# self.db.commit() #ロールバックエラーが発生します )(self.db.rollbackを :最後に self.cursor.close() DEF deleteDB(セルフ、SQL): '' '' 'データベースのデータの操作が削除された' (self.cursor self.db.cursor = ) 試してください: #SQL実行 self.cursor.execute(SQL)# は、返されたデータ値の部分が処理結果に応じて決定することができる削除の数を返す)#TT = self.cursor.execute(SQLを #印刷(TT) self.db.commit() 除く: ロールバック#エラー self.db.rollback() 最後に: self.cursor.close() DEFがupdatedbを(自己、SQL): '' 'データベースを更新する操作' '' = self.db.cursorのself.cursor() のtry: #実行SQL self.cursor.execute(SQL) #TT = self.cursor.execute(SQL)#戻り処理結果に応じて決定することができるデータ値の更新数が返さ #印刷(TT) self.db.commit() 以外: エラーが発生したときに#ロールバック self.db.rollbackを(): 最後に self.cursor.close() DEF SelectDB(セルフ、SQL): '' 'データベースクエリ' '' = self.db.cursor self.cursor() トライ: self.cursor.execute(SQL)クエリ#を返すデータの数値は、処理結果に応じて決定することができる返さ データ= self.cursor.fetchall()#リターンにすべてのレコードのリスト (印刷データ) #結果トラバーサル データの行のための: SID =行[0] 名=行[1] #トラバース印刷結果 を印刷( 'SID =%S、名前=%S' %(SID、名前)) を除く: 印刷(「エラー'):データをfecthすることができません :最後に self.cursor.close() :DEFのclosedb(セルフ) ' ''データベース接続が閉じている''' self.db.close() self.w_server.close() == __name__ IF' __main__ ': DBHANDLE = DataBaseHandle() DbHandle.selectDb(' SELECT VERSION()「) DbHandle.closeDb()
データベースクラスの操作は、私が直接使用するために使用、それを書くためにいい感じ、私はインターネットから得たものです。
最後に、出口でのMySQLのssh接続をオフにすることを覚えて、覚えておいてください。