2015-04-11 4 views
0

Задача: Вызовите мой метод, значения выполняются и должны быть зафиксированы, но не нужно. Метод ниже, но это не вызывает какую-либо ошибки ... ничего не происходит, но значения не получают напечатали:Python SQLite3 UPDATE WHERE не обновляется

def updateNameWhereTime(self, time, name): # time is a floating point from time.time(), 
              # name is a simple string like 'this' 
    print(time, name) # This prints right values. 
    self.db.execute("UPDATE Flights SET name=(?) WHERE startTime=(?);", (name, time)) 
    self.db.commit() # Does not save anything to the .db 

Я карантин мало баз данных есть я мог, и это работает прекрасно. (quarantine here). Я знаю, что этот код должен работать. Кроме того, я новичок, и это мой первый проект.

Что-нибудь конкретное, что я должен был бы искать? Есть ли что-то, что я мог бы не делать?

EDIT: Полный код, который генерирует данные здесь, имеет статический образец HTML для тестовых прогонов: https://github.com/SimonWoodburyForget/Experiments/tree/master/WarThunder

ответ

0

Если вы хотите сохранить STARTTIME в качестве даты или отметки времени, то вы хотите объявить тип данных столбца по созданию соответственно.

c.execute("create table Flights (..., startTime date or startTime timestamp, ...)") 

Обратите внимание, что внутренне sqlite не сохраняет данные в качестве даты или метки времени. Данные будут численными.

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

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

https://docs.python.org/2/library/sqlite3.html#sqlite3.PARSE_COLNAMES

import sqlite3 
import datetime 

con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES) 
cur = con.cursor() 
cur.execute("create table test(d date, ts timestamp)") 

today = datetime.date.today() 
now = datetime.datetime.now() 

cur.execute("insert into test(d, ts) values (?, ?)", (today, now)) 
cur.execute("select d, ts from test") 
row = cur.fetchone() 
print today, "=>", row[0], type(row[0]) 
print now, "=>", row[1], type(row[1]) 

cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"') 
row = cur.fetchone() 
print "current_date", row[0], type(row[0]) 
print "current_timestamp", row[1], type(row[1]) 
0

Ниже приведен пример кода с течением времени в виде текста на данный момент. Это быстро и грязно, поэтому вы можете использовать его для тестирования. Я буду работать над преобразованием его в time.time().

Если тип данных параметра startType не совпадает с типом данных startTime базы данных, это также будет проблемой, и совпадение не будет найдено для обновления.

def updateNameWhereTime(time, name): # time is a floating point from time.time(),       
    print(time, name) 
    c.execute("UPDATE Flights SET name=? WHERE startTime=?;", (name, time)) 
    conn.commit() 

def insertRows(table, startTime, name): 
    c.execute("INSERT INTO Flights VALUES ('"+startTime+"', '"+name+"')") 

def printTableRows(table): 
    for row in c.execute("SELECT * FROM "+table): 
     print row 

import sqlite3 
conn = sqlite3.connect('example.db') 

c = conn.cursor() 

c.execute('''DROP TABLE IF EXISTS Flights''') 
c.execute('''CREATE TABLE Flights 
      (startTime text, name text)''') 

print "Inserting rows into table" 
insertRows('Flights','2015-04-11 10:00','Test 1') 
insertRows('Flights','2015-04-11 10:05','Test 2') 
insertRows('Flights','2015-04-11 10:10','Test 3') 
insertRows('Flights','2015-04-11 10:15','Test 4') 

print "Original data in table" 
printTableRows('Flights') 

print "Updating rows in table" 
updateNameWhereTime('2015-04-11 10:05','Test 2 Updated') 
updateNameWhereTime('2015-04-11 10:10','Test 3 Updated') 

print "Updated rows in table" 
printTableRows('Flights') 

Вот вывод, сгенерированный:

Inserting rows into table 
Original data in table 
(u'2015-04-11 10:00', u'Test 1') 
(u'2015-04-11 10:05', u'Test 2') 
(u'2015-04-11 10:10', u'Test 3') 
(u'2015-04-11 10:15', u'Test 4') 
Updating rows in table 
('2015-04-11 10:05', 'Test 2 Updated') 
('2015-04-11 10:10', 'Test 3 Updated') 
Updated rows in table 
(u'2015-04-11 10:00', u'Test 1') 
(u'2015-04-11 10:05', u'Test 2 Updated') 
(u'2015-04-11 10:10', u'Test 3 Updated') 
(u'2015-04-11 10:15', u'Test 4') 
+0

Полный код, который генерирует данные здесь, имеет статический образец HTML для тестовых прогонов: https://github.com/SimonWoodburyForget/Experiments/tree/master/WarThunder да я думаю, что это, возможно, что-то делать с моим курсором, я не совсем понимаю их, но я думаю. –

+0

Я сейчас смотрю на это и изучаю способ создания таблицы. Должно иметь что-то через несколько минут. –

+0

Я создал таблицу, используя код в GitHub, и столбец startTime создается с текстом типа данных. Не уверен, как он пытается сериализовать данные time.time(). Вы можете преобразовать параметр, который вы получаете в функции updateNameWhereTime(), в строку, а затем использовать ее в инструкции обновления. –

Смежные вопросы