[day9] 建置SQL DB

使用sqlite3建置一个本机资料库,当然要用mssql或自己挂Docker DB也可以

初始化资料库

暂时先行,可能後续再依据实际开发状况修改,以下为资料库结构创建SQL

BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "Users" (
	"UID"	INTEGER NOT NULL UNIQUE,
	"TYPE"	INTEGER NOT NULL,
	"NAME"	TEXT NOT NULL,
	"PWDHASH"	TEXT NOT NULL,
	PRIMARY KEY("UID" AUTOINCREMENT)
);
CREATE TABLE IF NOT EXISTS "Cards" (
	"CID"	INTEGER NOT NULL UNIQUE,
	"Bind_User"	INTEGER,
	"Balance"	INTEGER NOT NULL DEFAULT 0,
	"Frozen"	INTEGER NOT NULL DEFAULT 0,
	PRIMARY KEY("CID" AUTOINCREMENT)
);
CREATE TABLE IF NOT EXISTS "transmit_logs" (
	"ID"	INTEGER NOT NULL UNIQUE,
	"TYPE"	INTEGER NOT NULL DEFAULT 0,
	"STATUS"	INTEGER NOT NULL DEFAULT 0,
	"Remark"	TEXT,
	PRIMARY KEY("ID" AUTOINCREMENT)
);
CREATE TABLE IF NOT EXISTS "Order_logs" (
	"ID"	INTEGER NOT NULL UNIQUE,
	"TID"	INTEGER,
	"Valid"	INTEGER NOT NULL DEFAULT 0,
	"Shipment_Status"	INTEGER NOT NULL DEFAULT 0,
	"Order_INFO"	TEXT,
	PRIMARY KEY("ID" AUTOINCREMENT)
);
COMMIT;

使用Python调用sqlite3

载入资料库

如果目标路径没有档案,会建立一个新的.DB档案

import sqlite3 as db
conn = db.connect(env['SQL']['sqlite_URL'])
print(f"load database from {env['SQL']['sqlite_URL']} successfully")

初始化资料库(执行SQL档案)

读取SQL档案并执行

def exec_sqlfile(conn, fp):
    try:
        with open(fp, 'r') as sql_file:
            sql_script = sql_file.read()
        cursor = conn.cursor()
        cursor.executescript(sql_script)
        conn.commit()
        conn.close()
        print("Execte Script successfully")
        return True
    except Exception as err:
        print(err)
        return False

exec_sqlfile(conn=conn, fp="./data/sql/init.sql")

新增一个测试帐号(插入资料至指定Table)

sqlite3的占位符是**?**

格式为cursor.execute(str of sqlscript, (变数)),可以参考

def INS_user(conn, user):
    try:
        sql = f"INSERT INTO Users (TYPE, NAME, PWDHASH) VALUES (?, ?, ?)"
        cursor = conn.cursor()
        cursor.execute(sql, (user.type, user.name, user.pwdhash),)
        uid = cursor.lastrowid
        conn.commit()
        conn.close()
        print(f"Execte INSERTR user successfully:{uid}")
        return uid
    except Exception as err:
        print(err)
        return -1

查询User资料(SELECT from Table)

藉由UID查询User Table中的纪录

def quy_user(conn, uid):
  sql = f"SELECT * FROM Users WHERE UID = {uid}"
  print(sql)
  for row in conn.execute(sql):
      print(row)

这边写的比较急,刚烤肉回来月半中,後续可能会再慢慢追加forign key与其他资料库设计,先这样能用就好


<<:  我老爸教我赌钱的时候,赢要冲,输要缩 - 顺势交易

>>:  App 内的货币系统

Day 5 - 回圈及 ++ --运算式

大家好,我是长风青云。 今天我跟朋友讨论到我参加比赛这件事,她是一个完全没有程序基础的人。 她告诉我...

[Golang] Introduction to Control Flow

If statement if (condition1) { } else if (conditio...

[Day 18] -『 GO语言学习笔记』- 核心型别(IV)

以下笔记摘录自『 The Go Workshop 』。 接续上一篇的学习笔记。 其实可以直接使用fo...

DAY 4- 对称式、非对称式加密概要

你的心脏不是对称的,就跟你的脸一样。 Alice and Bob 首先要隆重介绍,密码学永远的男主角...

[Day06] Jekyll vs Hexo vs Hugo

在选择静态档案产生器时,最常看到的就是这三个的比较,我一样会简单的分析三者的特色,并且在最後提供我的...