遠程和Ubuntu服務器進行Socket通信,使用python和C#(準備篇)
服務器在阿裏雲上,和一般的本地配置方案不太一樣,所以網上的博客裏沒有解決辦法,本人在這裏記錄一下,方便大家交流。
由於數據要保存到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#(準備篇)