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://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
*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 丟資料的方法
-
Pymysql » 可是會掉資料
-
Mysql-Connector + Connection Pool
-
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上去