1

Тема: SQLite3 python3 додавання стовбців в створену таблицю

Доброго вечора?
Шукав в інтернеті чи можливо це реалізувати.
Нічого не знайшов.
Тому вирішив спитати тут, чи можливо це якось реалізувати?

Прихований текст

знаю що дурниця повна)))

import sqlite3

def start_db():
    global DataBase
    global SQL

    DataBase = sqlite3.connect("db.db")
    SQL = DataBase.cursor()
    DataBase.commit()

def create_table(table_name):
    start_db()
    SQL.execute(f"""CREATE TABLE IF NOT EXISTS {table_name}(
        id INTEGER
        )""")
    DataBase.commit()

def create_column(table_name, column_name, column_class):
    start_db()
    SQL.execute(f"""CREATE TABLE IF NOT EXISTS {table_name}(
        {column_name} {column_class}
        )""")
    DataBase.commit()

if __name__ == '__main__':
    create_table('table_1')
    create_column('table_1', 'column_1', 'INTEGER')

Ствоює таблицю table_1, а в ній стовбець id

2

Re: SQLite3 python3 додавання стовбців в створену таблицю

https://www.sqlite.org/lang_altertable.html

Подякували: mamkin haker, leofun012

3

Re: SQLite3 python3 додавання стовбців в створену таблицю

Якщо хтось сюди зазирне то ось відповідь:

відповідь

Синтаксис ADD COLUMN використовується для додавання нового стовпця до наявної таблиці. Новий стовпець завжди додається в кінець списку наявних стовпців.
наприклад
f"""ALTER TABLE {назва таблиці} ADD COLUMN {назва стовбця} {тип даних}"""

код
import sqlite3

def start_db():
    global DataBase
    global SQL

    DataBase = sqlite3.connect("db.db")
    SQL = DataBase.cursor()
    DataBase.commit()

def create_table(table_name):
    start_db()
    SQL.execute(f"""CREATE TABLE IF NOT EXISTS {table_name}(
        id INTEGER
        )""")
    DataBase.commit()

def create_column(table_name, column_name, column_class):
    create_table(table_name)
    #наступна стрічка створює нову нолонку
    SQL.execute(f"""ALTER TABLE {table_name} ADD COLUMN {column_name} {column_class}""")
    DataBase.commit()

if __name__ == '__main__':
    create_column('table_1', 'column_1', 'INTEGER')

4 Востаннє редагувалося koala (13.07.2021 10:06:55)

Re: SQLite3 python3 додавання стовбців в створену таблицю

Кілька коментарів до коду.
1. Глобальні змінні - зло. А в цьому коді вони ще й не мають жодного сенсу, бо db та SQL перестворюються в обох функціях.
2. Ви перевідкриваєте з'єднання в обох функціях, що неефективно.
Ці проблеми легко вирішити, створивши клас, що інкапсулює з'єднання.

class Connection:
    def __init__(self, dbname = 'db.db'):
        self.database = sqlite3.connect(dbname)
        self.cursor = database.cursor()
        #commit тут не потрібен, жодних змін не внесено
   def create_table(self, ...):
       #не треба start_db і глобальні змінні, використовуємо self
       ...
   def create_column(self, ...):
       #не треба start_db
       ...

if __name__ == '__main__':
    conn = Connection()
    conn.create_table('table_1')
    conn.create_column('table_1', 'column_1', 'INTEGER')

3. Ви передаєте в БД невичищені стрічки, що є антипатерном безпеки (гугліть Bobby Tables). Найкращий спосіб уникнути проблем - використовувати знаки питання чи іменні підставлення:

SQL.execute("""CREATE TABLE IF NOT EXISTS ? (
        id INTEGER
        )""", (table_name,))

args = {"table_name":table_name, "column_name":column_name, "column_class":column_class}
SQL.execute("""ALTER TABLE :table_name ADD COLUMN :column_name :column_class""", args)
Подякували: mamkin haker, leofun012

5

Re: SQLite3 python3 додавання стовбців в створену таблицю

Та я так, з цікавості цим займаюсь :3
Але всеодно дякую!

6

Re: SQLite3 python3 додавання стовбців в створену таблицю

Перепрошую, я звісно не професіонал, але мені 'здаєтся' що оператор new не потрібен я ось просидів пів години і шукав в інтернеті про оператор new в пайтон...
Його нібито як і констант не існує, ну на моїй версії пайтон (3.6.9)
Та й оця частина коду не працює =(

    def create_column(self, table_name, column_name, column_class):
        args = {
        "table_name" : table_name,
        "column_name" : column_name,
        "column_class" : column_class
        }

        self.cursor.execute("""ALTER TABLE :table_name ADD COLUMN :column_name :column_class""", args)
        self.database.commit()
помилка

Traceback (most recent call last):
  File "sql.py", line 28, in <module>
    conn.create_column('table_1', 'column_1', 'INTEGER')
  File "sql.py", line 22, in create_column
    self.cursor.execute("""ALTER TABLE :table_name ADD COLUMN :column_name :column_class""", args)
sqlite3.OperationalError: near ":table_name": syntax error

ось повний код
import sqlite3

class Connection(object):

    def __init__(self, dbname = 'db.db'):
        self.database = sqlite3.connect(dbname)
        self.cursor = self.database.cursor()

    def create_table(self, table_name):
        self.cursor.execute(f"""CREATE TABLE IF NOT EXISTS {table_name} (
            id INTEGER
            )""")
        self.database.commit()

    def create_column(self, table_name, column_name, column_class):
        args = {
        "table_name" : table_name,
        "column_name" : column_name,
        "column_class" : column_class
        }

        self.cursor.execute(f"""ALTER TABLE {table_name} ADD COLUMN {column_name} {column_class}""")
        self.database.commit()

if __name__ == '__main__':
    conn = Connection()
    conn.create_table('table_1')
    conn.create_column('table_1', 'column_1', 'INTEGER')

А решта ніби все працює :3

Подякували: leofun011

7

Re: SQLite3 python3 додавання стовбців в створену таблицю

Дякую за уточнення по new, дійсно, помилка. Виправив.

Подякували: FakiNyan1