顯示具有 mysql 標籤的文章。 顯示所有文章
顯示具有 mysql 標籤的文章。 顯示所有文章

2019年10月22日 星期二

Ubuntu 18.04 安裝 Nginx+MySQL+PHP

安裝 Nginx, MySQL:
sudo apt-get update
sudo apt-get install nginx
sudo apt-get install mysql-server

設定MySQL安全性設定:
sudo mysql_secure_installation

安裝PHP:
sudo apt-get install php-fpm php-mysql php-json php-gd

設定 php.ini,編輯 /etc/php/7.2/fpm/php.ini,將cgi.fix_pathinfo設為0
;cgi.fix_pathinfo=1
cgi.fix_pathinfo=0

重新啟動PHP服務:
sudo service php7.2-fpm restart

設定一個新的nginx網站,以adia.cc為例。編輯 /etc/nginx/sites-available/adia.cc檔案:
server {
        listen 8080;
        root /var/www/adia.cc/html;
        index index.php index.html index.htm;
        access_log /var/log/nginx/adia.cc.access.log;
        error_log /var/log/nginx/adia.cc.error.log;
        server_name adia.cc www.adia.cc;
 
        location / {
                try_files $uri $uri/ =404;
        }
 
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }
 
        location ~ /\.ht {
                deny all;
        }
}

建立adia.cc網站設定檔連結,並測試設定檔是否正確:
sudo ln -s /etc/nginx/sites-available/adia.cc /etc/nginx/sites-enabled/
sudo nginx -t

正確的話,應該會出現類似結果:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

接著建立一個PHP測試網頁,編輯 /var/www/adia.cc/html/info.php:
<?php
   phpinfo();
?>
重新啟動 Nginx 服務:
sudo service nginx restart

接下來利用瀏覽器測試 http://YOUR_IP/ 和 http://YOUR_IP:8080/info.php是否正常~
phpinfo() 執行結果


#

2019年4月30日 星期二

python 抓取上市及上櫃公司清單, 並寫入 MySQL 資料庫

不囉嗦,直接看程式碼:
# 如何獲得上市上櫃股票清單
import requests
import time
import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.types import NVARCHAR, Date

def getTWSE(str_mode):
     # 設定爬蟲程式的 User_Agent
    headers = {'user-agent': 'Mozilla/5.0 (Macintosh Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}
    # 上市: http://isin.twse.com.tw/isin/C_public.jsp?strMode=2
    # 上櫃: http://isin.twse.com.tw/isin/C_public.jsp?strMode=4
    req_url = "http://isin.twse.com.tw/isin/C_public.jsp?strMode=%s" % (str_mode)
    res = requests.get(req_url, headers=headers)
    df = pd.read_html(res.text)[0]

    # 設定column名稱
    df.columns = df.iloc[0]
    # 刪除第一行
    df = df.iloc[1:]
    # 先移除row,再移除column,超過三個NaN則移除
    df = df.dropna(thresh=3, axis=0).dropna(thresh=3, axis=1)
    df[['有價證券代號','名稱']] = df['有價證券代號及名稱'].str.split(n=1, expand=True)
    del df['有價證券代號及名稱']
    df = df.set_index('有價證券代號')
    return df

engine = create_engine("mysql+pymysql://stockuser:password@127.0.0.1:3306/stockdb")

dtypedict = {
    '有價證券代號':NVARCHAR(length=32),
    '上市日': Date()
}

# 抓取上市公司股票清單, 寫入MySQL > stockdb > listed_code (listed_code table存在時整個取代)
listed_companies = "2"  #上市公司
mydf1 = getTWSE(listed_companies)
mydf1.to_sql(name="listed_code", con=engine, if_exists = 'replace', index=True, dtype=dtypedict)

# 先睡個10秒鐘吧
time.sleep(10)

# 抓取上櫃公司股票清單, 寫入MySQL > stockdb > listed_code (append 到 listed_code table)
listed_companies = "4" #上櫃公司
mydf2 = getTWSE(listed_companies)
mydf2.to_sql(name="listed_code", con=engine, if_exists = 'append', index=True, dtype=dtypedict)

2019年4月29日 星期一

python 讀取 MySQL 資料

sqlalchemy連結MySQL時,必須先安裝另一模組 pymysql
pip install pymysql
接下來利用 python 來讀取先前我們用R寫入的股價資料庫吧
%matplotlib inline

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://stockuser:password@127.0.0.1:3306/stockdb")

sql ="select * from tw1101;"

df = pd.read_sql_query(sql, engine)

print(df)

df.close.plot()
執行結果:
  row_names        date       open       high        low      close  \
0            1  2009-01-02  24.193001  24.193001  24.193001  24.193001   
1            2  2009-01-05  25.135599  25.225300  24.597000  24.821400   
2            3  2009-01-06  24.955999  25.135599  24.372499  24.641800   
3            4  2009-01-07  25.090700  25.449800  24.417400  25.225300   
4            5  2009-01-08  24.372499  24.731600  23.789000  24.417400   
5            6  2009-01-09  24.552099  25.090700  23.789000  23.789000   
...
          volume   adjusted  
0            0.0  14.254436  
1     22712510.0  14.624688  
2     20298561.0  14.518868  
3     26370751.0  14.862664  
4     23748492.0  14.386651
...
2536  30751985.0  41.000000  
2537  23165336.0  41.599998  
2538  16390191.0  41.549999  
2539  13459252.0  41.799999  
2540  11300709.0  41.750000  

[2541 rows x 8 columns]

2019年4月28日 星期日

R tidyquant 抓取股價資料寫入 MySQL 資料庫

MySQL上先建立一個新使用者 stockuser :
mysql -u root -p
出現 mysql > 後,開始建立新用者資料並設定密碼:
mysql >
mysql > GRANT ALL PRIVILEGES ON *.* TO 'stockuser'@'%' IDENTIFIED BY 'password';
mysql > FLUSH PRIVILEGES;
mysql > quit;
若MySQL伺服器要開放遠端連結,記得防火牆允入3306埠,另外 MySQL的設定檔也要檢查:
vi /etc/mysql/my.cnf
記得 bind-address = 127.0.0.1 這行要註解
#bind-address           = 127.0.0.1
也記得 MySQL 要重新啟動
service mysql restart
資料庫部分沒問題的話,就可以準備來使用R抓取股價資料~R 如果還沒有安裝過 RMySQL package, 也記得先安裝:
install.packages("RMySQL")
確認安裝完成後,就開始吧...
library(RMySQL)

library(DBI)
library(tidyquant)
library(dplyr)

cn <- dbConnect(
 drv = RMySQL::MySQL(),
 username='stockuser',
 password='password',
 host='127.0.0.1',
 port = 3306,
 dbname = "stockdb"
 )

#  利用 tidyquant 取得 Yahoo 上的台灣五十股價資料, 寫入 MySQL stockdb > tw{股票代碼}
tw50 <- c("1101","1102","1216") #只有示範三檔股票
for (i in tw50) {
 stockid <- paste(i,"TW",sep=".")
 tblname <- paste("tw",i,sep="")
 print(stockid)
 sdata <- tq_get(stockid)
 dbWriteTable(cn, name=tblname, value=sdata, overwrite=TRUE)
 Sys.sleep(10) # 每次 Loop 先休息 10 秒
}

# 利用 tidyquant 取得 Yahoo 上的IBM股價資料, 寫入 MySQL stockdb > ibm
ibm <- tq_get("IBM")
dbWriteTable(cn, name="ibm", value=ibm, overwrite=TRUE)

dbDisconnect(cn) #記得斷開資料庫連線
資料都抓取完成後,MySQL資料庫裡面 stockdb > 就會多個股 table :
mysql -u stockuser -p
輸入密碼,登入後...
mysql> use stockdb;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_stockdb |
+-------------------+
| ibm               |
| tw1101            |
| tw1102            |
| tw1216            |
+-------------------+
4 rows in set (0.00 sec)
以後就可以直接從 MySQL 中讀取股價資料來運用:
# 從 MySQL 取出 IBM 股價資料
cn <- src_mysql(
 user='stockuser',
 password='password',
 host='127.0.0.1',
 port = 3306,
 dbname = "stockdb"
 )

ibm_table <- tbl(cn, "ibm")
ibm_table

dbDisconnect(cn)
延伸閱讀資料:
  • Amazon RDS + R (其實我是租不起, 所以自建 MySQL...)
  • R學習筆記 - 資料工程篇(四) Database


  • 2013年8月25日 星期日

    ubuntu 安裝 easy_install 和 MySQL Connector/Python


    1. 安裝 easy_install
    2. > sudo wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python
    3. 安裝 Mysql Connector/Python
    4. > sudo easy_install mysql-connector-python

    範例程式
    import mysql.connector
    from mysql.connector import errorcode

    try:
      cnx = mysql.connector.connect(user='userid', password='******',
                                  host='127.0.0.1',
                                  database='dbname', charset='utf8')
    except mysql.connector.Error as err:
      if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("Something is wrong with your user name or password")
      elif err.errno == errorcode.ER_BAD_DB_ERROR:
        print("Database does not exists")
      else:
        print(err)
    else:
      cursor = cnx.cursor()
      query = ("SELECT * FROM tablename ORDER BY id DESC LIMIT 10;")
      cursor.execute(query)
      for i in cursor:
        print i
      cursor.close()
      cnx.close() 


    延伸閱讀:MySQL Connector/Python 官網

    #

    2012年7月13日 星期五

    更新至 ubuntu 12.04 後, MySQL 5.5 無法啟動

    ubuntu 更新至 ubuntu 12.04 後, MySQL 也從 5.1 更新至 5.5版。但執行

    sudo service mysql start 

    卻出現

    start : Job failed to start 


    mysqld 無法正常啟動。查了一下 /var/log/mysql/error.log 發現


    [ERROR] /usr/sbin/mysqld: unknown variable 'default-character-set=utf8' 
    [ERROR] Aborting 


    看來問題出現在預設字元參數設定上,將 /etc/mysql/my.cnf 設定檔中,所有的

       default-character-set=utf8

    註解掉,改為

       #default-character-set=utf8


    再重新啟動

    service mysql start 

    即可正常執行。

    #

    後記:

    部份網站文章建議將 default-character-set=utf8 改為 character_set_server=utf8 ,雖然mysqld 可以啟動執行,但如果執行


    mysql -u root -p 


    之類的 console 指令時,依然無法正常執行,會出現下列訊息:


    mysql: unknown variable 'character_set_server=utf8'


    /etc/mysql/my.cnf 拿掉 character_set_server=utf8 之後,就正常囉。



    ##

    2012年6月13日 星期三

    MySQL 每小時的數據資料統計

    範例:找出 my_table 資料表每小時的資料統計


    select hour(my_timeStamp) as hour, count(1) as count from my_table where DATE_FORMAT(my_timestamp, '%Y-%m-%d') = '2012-06-11' group by hour(my_timestamp);



    2012年5月30日 星期三

    找出/刪除MySQL資料表中重複的資料

    範例:找出 my_table 資料表中 name 重複的資料

    select name,count(*) from my_table group by name having count(*) > 1;


    範例:刪除 my_table 資料表中 name, id 重複的資料

    alter ignore table my_table add unique index(name, id);



    2012年4月25日 星期三

    ubuntu 更新 MySQL 資料庫時,先移除 /etc/mysql/ 內不相關的大檔案

    這幾天發現 ubuntu 使用apt-get 更新新版 MySQL 資料庫時,一直無法短時間內安裝完成。top指令結果發現 egrep 吃掉了將近 9x.x%的CPU。ps -ef |grep mysql 後發現,安裝 .deb過程時的某行 egrep 指令正在檢查 /etc/mysql/ 目錄內的檔案。

    忽然意識到,前些日子 mysqldump 的某個結果大檔(其實也僅有3xMB),就放在/etc/mysq/ 底下。猜想一下,決定壓縮、移開這個大檔案到其他目錄。

    重新執行apt-get更新後,果然問題迎刃而解。

    建議以後更新 ubuntu package時,除了可能存取 MySQL 的程式或Web Server先停止後,再停止 mysqld ,確認 /etc/mysql/ 目錄下沒有一些不相關的檔案內容,然後再執行更新。

    $ su -
    $ /etc/init.d/apache2 stop
    $ /etc/init.d/mysql stop
    $ cd /etc/mysql/; (檢查是否有不相關的檔案,暫時移至其他目錄下。)
    $ apt-get update
    $ apt-get dist-upgrade


    碰巧遭遇此情況,提供各位參考。

    #