Как правильно управлять растущими кодами Python3 / SQLite3 / tkinter? - PullRequest
0 голосов
/ 14 ноября 2018

Я новичок в Python и создаю настольное приложение для себя.Одно из моих окон - «Добавить компанию».Вот скриншот: https://ibb.co/hgyFAL

До сих пор я собираю данные от пользователей и храню в SQLite3 с кодом ниже:

import sqlite3 as sql
import os


def create_new_company(
    name,
    address,
    district,
    city,
    country,
    general_email,
    phone1,
    phone2,
    fax,
    tax_number,
    tax_administration,
    activity_area,
    contact,
    contact_task,
    is_client,
    is_supplier,
    is_in_mail_list,
    is_in_sms_list,
    is_in_black_list,
    note,
    is_active):

    db = sql.connect(str(os.getcwd() + '\\Databases\\main_db.sqlite3'))
    cursor = db.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS `companies` (
    `company_id`    INTEGER NOT NULL DEFAULT 0000001 PRIMARY KEY AUTOINCREMENT UNIQUE,
    `name`  TEXT,
    `address`   TEXT,
    `district`  TEXT,
    `city`  TEXT,
    `country`   TEXT,
    `general_email` TEXT,
    `phone1`    NUMERIC,
    `phone2`    NUMERIC,
    `fax`   NUMERIC,
    `tax_number`    TEXT,
    `tax_administration`    NUMERIC,
    `activity_area` TEXT,
    `contact`   TEXT,
    `contact_task`  TEXT,
    `is_client` INTEGER,
    `is_supplier`   INTEGER,
    `is_in_mail_list`   INTEGER,
    `is_in_sms_list`    NUMERIC,
    `is_in_black_list`  NUMERIC,
    `note`  TEXT,
    `is_active` NUMERIC);""")

    values = (
        name,
        address,
        district,
        city,
        country,
        general_email,
        phone1,
        phone2,
        fax,
        tax_number,
        tax_administration,
        activity_area,
        contact,
        contact_task,
        is_client,
        is_supplier,
        is_in_mail_list,
        is_in_sms_list,
        is_in_black_list,
        note,
        is_active
    )
    script= """INSERT INTO companies VALUES (
    NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"""

    cursor.execute(script, values)
    db.commit()
    db.close()

До прошлой недели я не делалвсе равно, код хороший или нет.Но приложение растет, и я боюсь, что не смогу управлять кодом в будущем.На самом деле, даже сейчас я не могу справиться, и у меня просто 3 окна.: /

Итак, я начинаю спрашивать себя, «как это может быть лучше», и я искал в Интернете свой вопрос.Я нашел хорошие источники и отличный совет, и я обновил свой код следующим образом:

class SQLCommands:
    sqlite_file = str(os.getcwd() + '\\test.db')

    def __init__(self):
        if os.path.exists(self.sqlite_file):
            pass
        else:
            self.create_new_database(self.sqlite_file)

    def create_new_database(self, database_path):
        with sqlite3.connect(database_path) as conn:
        c = conn.cursor()

        c.execute("""CREATE TABLE IF NOT EXISTS `companies` (
            `company_id`    INTEGER NOT NULL PRIMARY KEY UNIQUE,
            `name`  TEXT);""")

        self.close(conn)

    def connect(self, database_path):
        with sqlite3.connect(database_path) as conn:
            c = conn.cursor()
            return conn, c

    def close(self, conn):
        conn.commit()
        conn.close()

С последним обновлением я думаю, что лучше, и основные функции в порядке.Но теперь я застрял здесь, и мне нужна дорожная карта.

Я представляю себе функцию, подобную приведенной ниже, но не могу подвести конец:

class SQLCommands:
    sqlite_file = str(os.getcwd() + '\\test.db')

    # def other_fucntions
    #     ...some codes here...
    #     .....

    def insert(self, table, column, value):
        conn, c = self.connect(self.sqlite_file)
        values = (value,)
        script = """INSERT INTO {} VALUES (?)""".format(table)  # I'm not sure if the correct way is this

        c.execute(script, value)
        conn.commit()
        conn.close()

        del value, script, conn, c

Я представляю себе, как использовать это:

class Company(tk.Toplevel):
    def __init__(self):
        self.init_ui()

    def init_ui(self):
        company_name_lbl = ttk.Label(self, text="Company Name").grid(
            row=1, column=0, sticky='w')
        self.company_name_entry = ttk.Entry(self)
        self.company_name_entry.grid(row=1, column=1)

        company_address_lbl = ttk.Label(self, text="Company Address").grid(
            row=1, column=0, sticky='w')
        self.company_address_entry = ttk.Entry(self)
        self.company_address_entry.grid(row=1, column=1)

        save_btn = ttk.Button(self, text="Save", command=self.insert_to_sql)


    def insert_to_sql(self):
        value_list = ["NULL", self.company_name_entry.get(), self.company_address_entry.get()]
        column_header_list =  ["company_id", "name", "adress"]

        sql = SQLCommands()

        for i in range(len(value_list)):
            sql.insert(table="companies", column=column_header_list[i], value=value_list[i])

Моя будущая цель - изучить Django и перенести мое приложение в Интернет с Django.Итак, класс SQLCommands не должен зависеть от Tkinter.

Я на правильном пути?Это правильный способ сделать?Если да, то как мне заполнить код "SQLCommands.insert"

Мой английский может быть неясным, но я стараюсь изо всех сил.

Извините заранее, и большое спасибо заранее.Alperen

...