Blog Cover Image

Inspire you to have New thinking, Walk out your unique Road.

有的時候,你無意間遇到的一些故事,會激發你的靈感,改變你的想法,接下來你會用與之前全然不同的觀念去創造屬於你獨特的故事。

Sign @MinaYu.

後端小菜鳥學習記錄(4)

Posted on

9/17

#看看資料庫Table內有幾筆資料
SELECT COUNT(*) FROM User;

#刪除Table內全部資料
truncate TABLE User;

$git rm $git commit -m “filename”

測試Pymysql 及 SQLAlchemy

SQLAlchemy 可處理大量資料

Pymysql會掉資料

測試為什麼Pymysql 會掉資料(4h)

$git pull
$git fetch
$git push

嘗試用其他方式寫(午4點) (3 Hours)

https://bigdatafinance.tw/index.php/tech/data-processing/500-python-mysql

connector(30min)

http://blog.topspeedsnail.com/archives/6018

peewee

http://xiaorui.cc/2015/10/09/%E8%81%8A%E8%81%8Apython%E7%9A%84%E8%BD%BB%E9%87%8F%E7%BA%A7orm-peewee%E5%8F%8A%E5%AF%B9%E6%AF%94sqlalchemy/

http://docs.peewee-orm.com/projects/flask-peewee/en/latest/database.html


實測 5000筆資料 Local » DB

connector-python: 4min34s
pymysql: 1min41s
SQLAlchemy: 49s

測Jmeter 1秒輸入DB Docker > DB

pymysql: 70筆資料
SQLAlchemy: 233筆資料

9/18

STUDY Python(早2 hours)

API Performance Test

10000筆
ORM: SQLAlchemy >> 1min43s
DRIVER: Connector-python >> 9min12s
DRIVER: Pymysql >> 58s (非常不穩)

將conn.close寫進迴圈: 50000筆資料 16min22s

4 hours for API performance Test


3 hours for learning DEBUG

**Debug 流程**

重建新環境

於docker建立local database

Docker » Schema

$docker-compose up -d
$./init-mysql.sh (裡面會寫指令)
$ifconfig
$ifconfig | grep inet (找到很像ip的)
$brew install telnet 
$telnet ip port (確認可連線)

Trying xx.x.x.xx… Connected to xx.x.x.xx. Escape character is ‘^]’. J


將flask-app.py的mysql connect ip 改成找到的ip

於project資料夾中

$docker-compose up

#這邊跟schema不同,於schema 跑 docker-compose up 是開啟mysql

#這邊是代表在local端將docker server開啟

再測試一次資料

於Jmeter 測試,ip要填localhost: 127.0.0.1

$grep

http://man.linuxde.net/grep


*Debug 注意

由於之前在學校建立寫程式的壞習慣

使得現在將這些壞習慣帶來公司後,有點水土不服

其實等於是將自己全部打掉重新矯正自己一次

以往,我都是遇到錯誤就複製貼上,然後亂改一通

經過昨下午被高手訓唸了一番後!!!!

告訴你們後端工程師不好當,真不好當!!

Debug首先看“官方手冊” 
config檔內 看到的是重點
再來看“google”,  "Stackoverflow"
最後是找人家的source code來看

Debug拆解資料流程 »> 優先檢查自己錯誤的地方 »因為最容易錯

分為

整合測試 >> 使用者來用的整個環境(就是加伺服器整體Run起的環境測試)
單元測試 >> 拆解成 網路 >> APP >> 資料庫,一層一層測
供應商測試 >> Lib提供者,通常除非是很新的函數庫,不然通常不大會錯





我的重修科目:
資訊網路,資料結構,python,資料流通,debug

會用到的相關指令

#忘了是什麼姑且先記得
ps 
ps aus
lsof





docker log 查詢指令
$docker-compose logs | grep [-v] [檢索字串] 

#像我是想把所有logs裡有GET成功的正確log消掉,剩下Error的訊息
$docker-compose logs | grep -v GET

9/19

4Hours for Connection Pool Making

通過這種檢查方式在Jmeter測試中抓出Bugs

def usr():

try:
    insert_usr()

except BaseException as e:
    return str(e)

return"OK"

昨日Bug原因懷疑是uwsgi內參數設置有誤

今日透過Jmeter找出問題為Mysql Time Out

透過大神指引,問題點出在Pymysql沒有Connection Pool

經過四小時奮鬥(早10點~午3點) 扣午餐時間

沒能做出Connection Pool

請示主管後,決定棄坑,投往connector/python的懷抱!


寫好兩種丟資料方法mysql-connector/SQLAlchemy(午3:30-6:30 約3小時)

消失了好一回,露出頭來我寫了兩個新的丟資料的方法

所以目前就是三個利用driver 丟資料的方法

  1. Pymysql » 可是會掉資料

  2. Mysql-Connector + Connection Pool

  3. SQLAlchemy Pool(不用orm只用他的pool做連結)

mysql-connector

https://pynative.com/python-database-connection-pooling-with-mysql/

https://dev.mysql.com/doc/connectors/en/connector-python-connection-pooling.html

SQLAlchemy

http://docs.sqlalchemy.org/en/latest/core/pooling.html

https://stackoverflow.com/questions/10770377/howto-create-db-mysql-with-sqlalchemy

http://sunnyingit.github.io/book/section_python/SQLalchemy-engine.html

#上傳資料用SQLAlchemy的Connection Pool

def insert_usr_by_sqlalchemy():
    engine = create_engine('mysql+pymysql://usr:pw@ip:port/db')
    connection = engine.connect()
    engine.execute("INSERT INTO ******") 
    # continue with your work...
    connection.close()

#上傳資料用pymysql(壓測會掉資料,需要另外寫Connection Pool)

def insert_usr_by_pymysql():
    conn = pymysql.connect(host='ip', port=port, user='usr', passwd='pw', db='db', charset='utf8', autocommit=True)
    cur = conn.cursor()
    usr = cur.execute("INSERT INTO*********")
    conn.commit()
    cur.close()
    conn.close()

#上傳資料用mysql-connector

def connector_python():
    try:
        connection_pool = mysql.connector.pooling.MySQLConnectionPool(pool_name="pynative_pool",
                                                                      pool_size=5,
                                                                      pool_reset_session=True,
                                                                      host='ip',
                                                                      port=port,
                                                                      database='db',
                                                                      user='usr',
                                                                      password='pw')

        connection_object = connection_pool.get_connection()
        cursor = connection_object.cursor()
        cursor.execute("INSERT INTO********")
        connection_object.commit()
        cursor.close()
        connection_object.close()

    except Error as e :
        print ("Error while connecting to MySQL using Connection pool ", e)

將碼改一改git上去