2019年12月29日 星期日

sqlite(二) 使用python程式

#前言
  • json資料來自網路,所以執行此程式必須連上網路。

#說明
  • 程式說明就夾在程式碼中
  • sqlite3套件,是使用SQL資料庫查詢語言處理。
    • 這裡只做建立資料庫,插入資料和顯示資料的功能。
  • 執行程式中加一點輸入
    • 輸入資料庫名稱,例如,abc.db
    • 輸入資料表名稱,例如,mytable
  • 加一點輸出
    • 使用prettytable套件,讓輸出排列一下
#程式功能說明
  • 1216create-once.py建立資料庫資料表,插入資料。(執行一次就好,否則相同的資料就一直添進去。)
  • 1216showdata-in-table.py 使用prettytable套件輸出的資料。(有的地方排列扭曲了,查不出原因,不像是空格問題。)
#需要DB Browser for SQLite 來幫忙
  • python程式處理資料很快,但是並沒有一個方便的資料庫管理介面,這裡 列有一些工具。

#程式碼
  1. #參考來源: fatdodo所發表的文章,https://cheng-min-i-taiwan.blogspot.com/2019/12/pythonsqlite-open-data.html
  2. import os
  3. import requests 
  4. import json
  5. import sqlite3 ###在python3它是內建,不必在安裝。

  6. '''
  7. 這個程式取自網路資料,所以欄位是固定的,如35-38行。
  8. 1. db=sqlite3.connect("dbName") 建立資料庫
  9. 2. cursor=db.cursor() 指定cursor來定位資料
  10. 3. ###用cursor.execute()執行sql指令 CREATE, 建立table。注意,最好加 IF NOT EXISTS,才不會因為table已存在而出錯。
  11. 4. 用cursor.executemany(sql, data) 執行sql指令,一次多筆資料放進資料表
  12. 5. db.commit() 寫入資料庫
  13. '''


  14. os.system("cls")

  15. #建立資料庫
  16. print("=====建立資料庫=====\n\n")
  17. dbName = input("輸入資料庫名稱,例如abc.db-->    ")
  18. db = sqlite3.connect(dbName)
  19. cursor  = db.cursor() 
  20. print("{}資料庫已經成功建立\n".format(dbName)) 

  21. tableName=input("輸入資料表名稱-->  ")

  22. #準備資料
  23. url  = 'http://www.ilepb.gov.tw/api/ILEPB01001/format/JSON'
  24. print("讀取來自「{}」的資料".format(url))
  25. resp = requests.get(url)
  26. json_dict = json.loads(resp.text)
  27. data = list()
  28. for i in range(len(json_dict)):
  29.     t = (json_dict[i]['加油站名稱'], 
  30.          json_dict[i]['加油站地址'], 
  31.          json_dict[i]['負責人'], 
  32.          json_dict[i]['聯絡電話'])
  33.     data.append(t)

  34. #建資料表,使用sql查詢語言。
  35. sql = '''CREATE TABLE IF NOT EXISTS {:s}(
  36.          ID INTEGER PRIMARY KEY AUTOINCREMENT,
  37.          GAS TEXT NOT NULL, 
  38.          ADDR TEXT NOT NULL, 
  39.          OWNER  TEXT NOT NULL,
  40.          TEL TEXT);'''.format(tableName)
  41. try:
  42.     cursor.execute(sql)
  43. except Exception as e:
  44.     print(e)
  45. #將資料寫入資料表
  46. #多筆資料一次放入,data是先前的tuple
  47. sql = 'INSERT INTO {:s} (GAS, ADDR, OWNER, TEL) VALUES (?,?,?,?);'.format(tableName)
  48. try:
  49.     cursor.executemany(sql, data) #寫入多筆資料的命令
  50.     db.commit() #這個指令才是真正寫入資料庫
  51. except Exception as e:
  52.     print(e)  
  53. print(".......")
  54. print("{}資料表已經完成輸入資料".format(dbName))
  55. cursor.close()

  1. #參考來源: fatdodo所發表的文章,https://cheng-min-i-taiwan.blogspot.com/2019/12/pythonsqlite-open-data.html
  2. import os
  3. import sqlite3 ###在python3它是內建,不必在安裝。

  4. '''
  5. 1. db=sqlite3.connect("dbName") 建立資料庫
  6. 2. cursor=db.cursor() 指定cursor來定位資料
  7. 3. ###用cursor.execute()執行sql指令 CREATE, 建立table。注意,最好加 IF NOT EXISTS,才不會因為table以存在而出錯。
  8. 4. 用cursor.executemany(sql, data) 執行sql指令,一次多筆資料放進資料表
  9. 5. db.commit() 寫入資料庫
  10. '''

  11. def show_table(cursor,tbName):
  12.     sql = 'SELECT * FROM {:s} ORDER BY id ASC;'.format(tbName)
  13.     try:
  14.         cursor.execute(sql)
  15.         rows= cursor.fetchall()
  16.         for i, row in enumerate(rows,1): #1代表i從1開始,內定是從0開始。
  17.             print(i, '>', row)
  18.     except Exception as e:
  19.         print(e)

  20. os.system("cls")
  21.         
  22. #開啟資料庫
  23. print("=====觀看資料表內容=====\n\n")
  24. dbName = input("輸入資料庫名稱,例如abc.db-->  ")
  25. db = sqlite3.connect(dbName)
  26. cursor  = db.cursor() 
  27. print("{}資料庫已經成功開啟\n".format(dbName)) 

  28. tableName = input("輸入要觀看的資料表-->  ")

  29.     
  30. show_table(cursor,tableName)
  31. cursor.close()

  1. #參考來源: fatdodo所發表的文章,https://cheng-min-i-taiwan.blogspot.com/2019/12/pythonsqlite-open-data.html
  2. import os
  3. import sqlite3 ###在python3它是內建,不必在安裝。
  4. from prettytable import PrettyTable

  5. '''
  6. 1. db=sqlite3.connect("dbName") 建立資料庫
  7. 2. cursor=db.cursor() 指定cursor來定位資料
  8. 3. ###用cursor.execute()執行sql指令 CREATE, 建立table。注意,最好加 IF NOT EXISTS,才不會因為table以存在而出錯。
  9. 4. 用cursor.executemany(sql, data) 執行sql指令,一次多筆資料放進資料表
  10. 5. db.commit() 寫入資料庫
  11. '''

  12. def show_table(cursor,tbName):
  13. #建立表格項目名稱
  14.     table = PrettyTable(['編號','加油站名稱','加油站地址','負責人','聯絡電話'])
  15.     table.align = "l" 
  16.     table.border=False
  17.     table.padding_width=3
  18.     
  19.     sql = 'SELECT * FROM {:s} ORDER BY id ASC;'.format(tbName)
  20.     try:
  21.         cursor.execute(sql)
  22.         rows= cursor.fetchall()
  23.         for row in rows: 
  24.             table.add_row(row)
  25.         #印出table
  26.         print(table)
  27.     except Exception as e:
  28.         print(e)

  29. os.system("cls")
  30.         
  31. #開啟資料庫
  32. print("=====觀看資料表內容=====\n\n")
  33. dbName = input("輸入資料庫名稱,例如abc.db-->  ")
  34. db = sqlite3.connect(dbName)
  35. cursor  = db.cursor() 
  36. print("{}資料庫已經成功開啟\n".format(dbName)) 

  37. tableName = input("輸入要觀看的資料表-->  ")





  38.     
  39. show_table(cursor,tableName)
  40. cursor.close()


沒有留言:

張貼留言