1. 程式人生 > >遠程和Ubuntu服務器進行Socket通信,使用python和C#(準備篇)

遠程和Ubuntu服務器進行Socket通信,使用python和C#(準備篇)

ESS 簡單 nts 行操作 img passwd ant password users

  服務器在阿裏雲上,和一般的本地配置方案不太一樣,所以網上的博客裏沒有解決辦法,本人在這裏記錄一下,方便大家交流。

  由於數據要保存到MySQL數據庫中,使用python對數據進行操作,爬到數據直接進行保存。上一篇博客裏已經講過安裝python時需要註意的一個小問題,這篇博客主要講MySQL的安裝配置和python連接數據庫的一個小問題(坑)。

1. 安裝和配置MySQL

  MySQL的安裝很簡單,用命令行apt-get即可。這個網上博客很多就不贅述。重點是安裝後的配置,為了支持中文需要修改兩處配置文件。(如果已經保存過數據在裏面,那修改起來就很繁瑣,所以一步到位,提前改好。)

  1. 在文件/etc/mysql/conf.d/mysql.cnf 下加一行:default-character-set=utf8,然後保存,完整截圖:

                        技術分享圖片 

  2. 在文件/etc/mysql/mysql.conf.d/mysqld.cnf 中間部分,Basic Settings裏加 character-set-server=utf8,然後保存,截圖:

                        技術分享圖片

  然後重啟MySQL,命令行裏輸入:

  1 service mysql restart 

  用root用戶登錄MySQL,使用SQL語句查看:

  1 show variables like %char%;

                    技術分享圖片

  如果是這樣證明修改成功。接下來使用命令創建一個數據庫、表、新用戶,來供python連接數據庫使用:

  1 create database basename;    # basename是想創建的數據庫名稱
  2 use basebname;    # 進入這個新建的數據庫
  3 create table tablename(ID varchar(30) not null, Address varchar(70), primary key(ID));    #在裏面新建一個表含兩列,ID和Adress,ID不能為空,主鍵設置為ID
  4 grant all privileges on basename.tablename to user01@"%" identfied by "password";
  
5 flush privileges; # 更新權限使得其生效

  上面第四句是新建一個名為user01的用戶,在basename裏的tablename表裏有所有的權限,@"%"表示可以在任何地方訪問以密碼password訪問,換成@"localhost"表示只能在本地訪問。而查看哪些用戶具有哪些權限的語句是:

  1 select user, host from mysql.user;    # 查看所有用戶名和他們的訪問位置
  2 show grants for user01@"%";    # 查看user01用戶的所有權限

  我們知道權限控制是很重要的,如果給錯權限可以撤銷:

  1 revoke create,drop on basename.tablename to user01@"%";    # 撤銷用戶創建和刪除的權限
  2 flush privileges;  # 更新權限

2. Python連接MySQL

  Python3使用PyMySQL來操作MySQL,Python2使用MySQLdb。這裏安裝PyMySQL。

  1 pip install pymysql

  接下來給出一個簡短的例子說明使用方法:

   1 import pymysql.cursors
   2
   3 # 連接數據庫
   4 connection = pymysql.connect(host=要連接的IP,
   5                              user=user,
   6                              password=passwd,
   7                              db=db,# 要連接的數據庫
   8                              charset=utf8mb4,
   9                              cursorclass=pymysql.cursors.DictCursor)
  10 
  11 try:
  12     with connection.cursor() as cursor:
  13         # 寫一個插入語句,向user這個表插入一條記錄
  14         sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"  # 
  15         cursor.execute(sql)
  16 
  17     # 最後提交一下變更
  18     connection.commit()
  19 
  20     with connection.cursor() as cursor:
  21         # 查詢一條記錄,也可以用fetchall查詢所有滿足條件的記錄
  22         sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
  23         cursor.execute(sql)
  24         result = cursor.fetchone()
  25         print(result)
  26 finally:
  27     connection.close()

  看似一切正常,work well,但是在運行自己構造sql語句的時候始終報錯:

  1 sql = "update "+tablename+" set Address="+info[ad]+" where ID like "+id[1]
  2 pymysql.err.InternalError: (1054, "Unknown column ‘Address‘ in ‘field list‘")

  一般出現這個錯誤是sql語句有問題,比如裏面少了空格。試了別人的博客裏的方法都不靠譜,最後發現這是單引號引起的問題。語句裏賦的值應該用函數repr處理一下供解釋器使用。

  1 sql = "update "+tablename+" set Address="+repr(info[ad])+" where ID like "+repr(id[1])

  另外MySQL單獨使用單引號和雙引號沒有區別。

遠程和Ubuntu服務器進行Socket通信,使用python和C#(準備篇)