Вставить не обновляемую таблицу sqlite - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь заполнить таблицу sqlite3 данными из скрипта Python, но моя 2-я вставка всегда не может обновиться.

Я пытался вызвать две функции, которые имеют две отдельные команды, выполняющие много действий в таблице.

db_file_name = 'students.db'

conn = sqlite3.connect(db_file_name,)
cursor = conn.cursor()
def create_table():

    conn.execute("""CREATE TABLE IF NOT EXISTS students(

                        FirstName text,
                        SurName text,
                        Class text,
                        Major text,
                        Minor text
                    );""")
    conn.commit()

Это прекрасно работает, затем я перехожу на:


def insert_names():
    try:
        sql = "INSERT INTO students(FirstName,SurName) VALUES(?, ?)"
        cursor.executemany(sql,full_names)
    except sqlite3.IntegrityError as e:
        print('sqlite error: ', e.args[0])
    conn.commit()

def insert_class_degree():
    try:

        sql = "INSERT INTO students(Class,Major,Minor) VALUES(?, ?, ?)"
        cursor.executemany(sql,class_dept)
    except sqlite3.IntegrityError as e:
        print('sqlite error: ', e.args[0])


create_table()
insert_names()
insert_class_degree()
conn.commit()
conn.close() 

full_names - список кортежей:

[('firstname','lastname'),('firstname','lastname')]

class_dept - списоккортежи:

[('senior','art','history'),('freshman','math','biology')]

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

Я не получаю никаких ошибок, я используюsqlite studio для подключения и просмотра базы данных во время тестирования.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Мне нужно было добавить первичный ключ в таблицу:

def create_table():
    '''
    drop table if it already exists, then create table
    '''
    conn.execute("""DROP TABLE IF EXISTS students""")
    conn.execute("""CREATE TABLE IF NOT EXISTS students(
                        ID integer not null primary key,
                        FirstName text ,
                        SurName text ,
                        Class text ,
                        Major text ,
                        Minor text,
                        unique(ID) 
                    );""")

Затем я изменил функцию insert_class_degree обновлением, где ID = существующий первичный ключ:

def insert_class_degree():
    '''
    insert class degree into DB w/executemany
    '''
    try:


        cursor.executemany("""UPDATE students set Class = ?,Major =?, Minor = ? where ID =? """,(class_info_2))
        conn.commit()
    except sqlite3.IntegrityError as e:
        print('sqlite error: ', e.args[0])

Я думаю, что я мог бы вставить все столбцы одновременно, и я думаю, что это был бы предпочтительный метод.

0 голосов
/ 27 октября 2019

Я проверил, что с правильно определенными определениями двух массивов (full_names и class_dept) все вставки работают правильно:

select * from students;
firstname|lastname|||
firstname|lastname|||
||senior|art|history
||freshman|math|biology

Поскольку вы не упомянули, где эти массивы определены вваш код, было бы разумно предположить, что вы определили их в неправильных местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...