Как записать значение в выбранную строку и столбец в SQLite с использованием Python - PullRequest
0 голосов
/ 18 мая 2018

Итак, я сейчас пытаюсь работать с базой данных SQLite и надеялся получить некоторые сведения о том, как лучше всего записать значение в определенную строку и столбец (то есть ячейку) базы данных.Я знаю, как записывать в базу данных построчно, так что в основном каждый раз добавляю строку в конец базы данных, но вместо этого я хотел бы записывать данные в базу данных не последовательно.

Я поставилНиже приведен произвольный пример, чтобы проиллюстрировать, что я пытаюсь сделать, используя яблоки.В этом случае я создаю две таблицы в базе данных.Первая таблица будет моей идентификационной таблицей и называется яблок .Он будет содержать первичный ключ и два столбца для имени яблока и фермы, в которой он выращен. Вторая таблица keyFeatures снова будет содержать первичный ключ, который ссылается на идентификатор яблока в яблочной таблице., но также столбец для вкуса, текстуры и цвета.

В приведенном ниже примере у меня есть только вкус, текстура и цвет яблока Pink Lady с фермы 3. Теперь я хочу записать эту информацию встрока 3 таблицы keyFeature в соответствующих столбцах до заполнения любой из других строк.Для жизни я не могу понять, как это сделать.Я предполагаю, что мне нужно поместить курсор в правильную строку, но из документации мне не ясно, как этого добиться.Я уверен, что это тривиальная проблема, и если кто-то может указать мне правильное направление, я был бы очень признателен!

import sqlite3

dbName = 'test.db'

################# Create the Database File ###################

# Connecting to the database file
conn = sqlite3.connect(dbName)
c = conn.cursor()

#Create the identification table with names and origin
c.execute('''CREATE TABLE apples(appleID INT PRIMARY KEY, Name TEXT, 
farmGrown TEXT)''')

#Create the table with key data
c.execute('''CREATE TABLE keyFeature(appleID INT PRIMARY KEY, taste INT, 
texture INT, Colour TEXT)''')

#Populate apples table and id in keyFeature table
AppleName = ['Granny Smith', 'Golden Delicious', 'Pink Lady', 'Russet']
appleFarmGrown = ['Farm 1', 'Farm 2', 'Farm 3', 'Farm 4']
id = []

for i in range(len(AppleName)):
    id.append(i+1)
    c = conn.cursor()
    c.execute('''INSERT INTO apples(appleID, Name, farmGrown)
                    VALUES(?,?,?)''', (id[i], AppleName[i], appleFarmGrown[i]))

    c.execute('''INSERT INTO keyFeature(appleID)
                    VALUES(?)''', (id[i],))


#Current Apple to populate row in keyFeature
appleCurrent = (('Pink Lady','Farm 3')) 

tasteCurrent = 4
textureCurrent = 5
colourCurrent = 'red'

#Find ID and write into the database

c.execute("SELECT appleID FROM apples")
appleIDDB = c.fetchall()

c.execute("SELECT name FROM apples")
nameDB = c.fetchall()

c.execute("SELECT farmGrown FROM apples")
farmGrownDB = c.fetchall()

conn.commit()
conn.close()


# I assume that if I close the connection the cursor whould be positioned at the 
# first row again but this doesn't appear to be the case
conn = sqlite3.connect(dbName)

for i in range(len(appleIDDB)):
    c = conn.cursor()

    if ((nameDB[i][0] == appleCurrent[0]) and (farmGrownDB[i][0] == appleCurrent[1])):
        idCurrent = appleIDDB[i][0]
        print("This apple matches the apple stored with id number " +str(idCurrent))
        # This writes into the fifth row of the table
        c.execute('''INSERT INTO keyFeature(taste, texture, Colour)   
                   VALUES(?,?,?)''', (tasteCurrent, textureCurrent, colourCurrent))

conn.commit()
conn.close()

1 Ответ

0 голосов
/ 18 мая 2018

Вы почти у цели.

A реляционная база данных , такая как sqlite, не совсем похожа на таблицу в таблице.Вместо списка строк с определенным порядком у вас есть «большой набор строк» ​​(технически называемый набором кортежей), и вы можете сортировать их любым способом.

Способ решения вашей проблемыкак вы уже определили, когда создавали таблицу, убедитесь, что в каждой строке есть ключ , который позволяет нам ее идентифицировать (например, идентификатор вашего яблока).Когда мы хотим, чтобы этот ключ представлял идентификатор в другой таблице, это называется внешний ключ .Поэтому нам просто нужно добавить внешний ключ (называемый appleID) в таблицу keyFeature и использовать его всякий раз, когда мы добавляем в него строку.

Во-первых, избавьтесь от этого из вашего первого цикла forна данном этапе нам это не нужно, таблица может оставаться пустой.

c.execute('''INSERT INTO keyFeature(appleID)
                VALUES(?)''', (id[i],))

Далее вам не нужно получать всю таблицу, чтобы найти желаемое яблоко, вы можете просто выбратьодин, который вас интересует:

c.execute("SELECT appleID FROM apples WHERE name=? AND farm=?",("Pink Lady", "Farm 3"))
idCurrent = c.fetchone()[0]

Реальная хитрость заключается в том, что при добавлении данных в keyFeature мы должны вставить все данные в одну инструкцию.Таким образом, новый кортеж (строка) создается с идентификатором и всей другой информацией одновременно.Как будто это было «правильное место» в таблице.

c.execute('''INSERT INTO keyFeature(appleID, taste, texture, Colour)   
                   VALUES(?,?,?,?)''', (idCurrent, tasteCurrent, textureCurrent, colourCurrent))

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

c.execute("SELECT taste, texture, Colour FROM keyFeature WHERE apple_id=?", (my_apple_id,))

Окончательный полный код:

import sqlite3

dbName = 'test.db'

################# Create the Database File ###################

# Connecting to the database file
conn = sqlite3.connect(dbName)
c = conn.cursor()

#Create the identification table with names and origin
c.execute('''CREATE TABLE apples(appleID INT PRIMARY KEY, Name TEXT, 
farmGrown TEXT)''')

#Create the table with key data
c.execute('''CREATE TABLE keyFeature(appleID INT PRIMARY KEY, taste INT, 
texture INT, Colour TEXT)''')

#Populate apples table and id in keyFeature table
AppleName = ['Granny Smith', 'Golden Delicious', 'Pink Lady', 'Russet']
appleFarmGrown = ['Farm 1', 'Farm 2', 'Farm 3', 'Farm 4']
id = []

for i in range(len(AppleName)):
    id.append(i+1)
    c = conn.cursor()
    c.execute('''INSERT INTO apples(appleID, Name, farmGrown)
                    VALUES(?,?,?)''', (id[i], AppleName[i], appleFarmGrown[i]))

#Current Apple to populate row in keyFeature
appleCurrent = ('Pink Lady','Farm 3')

tasteCurrent = 4
textureCurrent = 5
colourCurrent = 'red'

#Find ID and write into the database
c.execute("SELECT appleID FROM apples WHERE name=? AND farm=?",(appleCurrent[0], appleCurrent[1]))
idCurrent = c.fetchone()[0]

c.execute('''INSERT INTO keyFeature(appleID, taste, texture, Colour)   
                       VALUES(?,?,?,?)''', (idCurrent, tasteCurrent, textureCurrent, colourCurrent))

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