1 Востаннє редагувалося verolim (03.09.2018 20:55:15)

Тема: Проблема з sqlite3.

Доброго здоровячка усім.
Виникла така проблема ось фрагмент прогрми:

num1 = 4565478
num2 = str(num1)
print("num2=", num2, "type(num2)=", type(num2))
cur1.execute("UPDATE number SET numd1=%s, numd4=1234567 WHERE DATE1='2018-08-21'" %(num1))
cur1.execute("")

conn1.commit()

Уе проходить, але коли відкриваю БД нічого не зінилося.
БД створюю так
cur1.execute('CREATE TABLE number (id INTEGER primary key, date1 VARCHAR(10), numd1 INTEGER, numd2 INTEGER, numd3 VARCHAR(2), numd4 INTEGER, numd5 INTEGER, yn VARCHAR(1))')

date1 = 2018-09-02

На скільки я зрозумів - не здійснюється пошук.
На пряму SQL запит працює нормально.

Допоможіть. Я по суті вчу Python при написанні цієї програми.

2

Re: Проблема з sqlite3.

Що таке cur1? Що таке conn1?

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

3

Re: Проблема з sqlite3.

А

SELECT * WHERE DATE1='2018-08-21'

щось показує? Бо якщо ні - то й апдейтити нема що.

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

4

Re: Проблема з sqlite3.

koala написав:

Що таке cur1? Що таке conn1?

курсор і з'єднання

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

5

Re: Проблема з sqlite3.

bunyk написав:
koala написав:

Що таке cur1? Що таке conn1?

курсор і з'єднання

Правда? Ви абсолютно точно певні, що в іншому фрагменті коду їх не переплутали?

6

Re: Проблема з sqlite3.

І ще. Той код який ви написали зараз - вразливий до SQL ін'єкцій. Правильніше замість

cur1.execute("UPDATE number SET numd1=%s, numd4=1234567 WHERE DATE1='2018-08-21'" %(num1))

Писати

cur1.execute("UPDATE number SET numd1=?, numd4=1234567 WHERE DATE1='2018-08-21'", (num1, ))

Тоді python сам підставить параметри в запит, і так що ніякий хакер туди не засуне свій "; drop table"

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

7

Re: Проблема з sqlite3.

koala написав:
bunyk написав:
koala написав:

Що таке cur1? Що таке conn1?

курсор і з'єднання

Правда? Ви абсолютно точно певні, що в іншому фрагменті коду їх не переплутали?

Ну, якби переплутали, то python би скаржився що з'єднання не має методу execute() чи якісь аналогічні експепшини викидав. Але раз "Уе проходить, але коли відкриваю БД нічого не зінилося." - значить проблема напевне в іншому. Але все може статись.

8

Re: Проблема з sqlite3.

conn1 = sqlite3.connect('uuuuuuu.db')
cur1 =conn1.cursor()

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

9 Востаннє редагувалося verolim (03.09.2018 15:38:54)

Re: Проблема з sqlite3.

bunyk написав:

А

SELECT * WHERE DATE1='2018-08-21'

щось показує? Бо якщо ні - то й апдейтити нема що.

Дякую.
Видає таке:
    cur1.execute("SELECT * WHERE number DATE1='2018-08-21'")
sqlite3.OperationalError: near "DATE1": syntax error

або так
    cur1.execute("SELECT * WHERE DATE1='2018-08-21'")
sqlite3.OperationalError: no tables specified

10

Re: Проблема з sqlite3.

bunyk написав:

І ще. Той код який ви написали зараз - вразливий до SQL ін'єкцій. Правильніше замість

cur1.execute("UPDATE number SET numd1=%s, numd4=1234567 WHERE DATE1='2018-08-21'" %(num1))

Писати

cur1.execute("UPDATE number SET numd1=?, numd4=1234567 WHERE DATE1='2018-08-21'", (num1, ))

Тоді python сам підставить параметри в запит, і так що ніякий хакер туди не засуне свій "; drop table"

Дякую. Але дана база є тільки на локальному компі.
Пробував і так писати - результат той же.
У мене підозра на кодування сторінки. Зараз буду перевіряти.

11

Re: Проблема з sqlite3.

bunyk написав:

Тоді python сам підставить параметри в запит, і так що ніякий хакер туди не засуне свій "; drop table"

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

12

Re: Проблема з sqlite3.

bunyk написав:

А

SELECT * WHERE DATE1='2018-08-21'

щось показує? Бо якщо ні - то й апдейтити нема що.

Перевірив таким чином
roz1 = cur1.fetchone()
print("roz1=", roz1)
all_rows = cur1.fetchall()
for row in cur1.execute("SELECT * FROM number WHERE date1=='2018-08-21'"):
    print("row=", row)

Результат
row= ('2018-08-21', None, None, None, None, None, 'n'), шо не відповідає дійсності.
Ось дані з перегляду файлу.

Post's attachments

Screenshot_2.png 20.26 kb, 94 downloads since 2018-09-03 

13

Re: Проблема з sqlite3.

bunyk написав:

А

SELECT * WHERE DATE1='2018-08-21'

щось показує? Бо якщо ні - то й апдейтити нема що.

Досліди ще, що ось такий код
conn1 = sqlite3.connect(my_datebase.db')
cur1 =conn1.cursor()
for row in cur1.execute("SELECT * FROM number"):
    tmp = cur1.fetchone()
    print("tmp=", tmp)
conn1.commit()
Виводить ось таку інфу
tmp= ('2018-09-01 22:52:11.508213', '5', 7, '9', 11, 15, 'n')
tmp= ('2018-08-30 22:52:11.508213', None, None, None, None, None, 'n')
tmp= ('2018-08-28 22:52:11.508213', None, None, None, None, None, 'n')
tmp= ('2018-08-26 22:52:11.508213', None, None, None, None, None, 'n')
tmp= ('2018-08-24 22:52:11.508213', None, None, None, None, None, 'n')

Process finished with exit code 0
Це блок чомусь читає через один запис.
Додаю скрін перегляду бази
Виконання запиту ("SELECT * FROM number") у програмі "DB Browser for SQLite" видає повний перелік записів.
Чому так???? Колись давно (років 10 тому) писав програми для БД на Фоксі, так що трішки ще памятаю запити, але з таким, щоб самовільно видавало тільки парні записи не зустрічався. Може проблема з переміщенням курсору?

Post's attachments

Screenshot_3.png 15.05 kb, 85 downloads since 2018-09-03 

14

Re: Проблема з sqlite3.

Можливо, ви просто переглядаєте різні файли? Назва 'uuuuuuu.db' може легко бути переплутана із uuuuuu, uuuuuuuu чи uuunuuu.

Подякували: varkon, PRY2

15

Re: Проблема з sqlite3.

koala написав:

Можливо, ви просто переглядаєте різні файли? Назва 'uuuuuuu.db' може легко бути переплутана із uuuuuu, uuuuuuuu чи uuunuuu.

Усе перевірено.
Чому тоді інший блок читає через один запис з того ж файлу?

16 Востаннє редагувалося bunyk (04.09.2018 10:35:09)

Re: Проблема з sqlite3.

Я здається здогадуюсь в чому проблема. SQLite зберігає дати як текст або цілі таймстемпи: https://www.sqlite.org/datatype3.html#d … e_datatype

А у вас нема жодного з датою 2018-08-21, всі з датами на зразок 2018-09-01 22:52:11.508213


Щодо питання чому код

conn1 = sqlite3.connect('my_datebase.db')
cur1 =conn1.cursor()
for row in cur1.execute("SELECT * FROM number"):
    tmp = cur1.fetchone()
    print("tmp=", tmp)
conn1.commit()

Виводить через рядок?

Думаю тому що цикл це вже ітерація по курсору, а cur1.fetchone() - це ще один інкремент курсору.  Якби ви написали:

conn1 = sqlite3.connect('my_datebase.db')
cur1 =conn1.cursor()
for row in cur1.execute("SELECT * FROM number"):
    print("tmp=", row)

То воно напевне вивело би всі.

Подякували: verolim, leofun01, PRY3

17

Re: Проблема з sqlite3.

bunyk написав:

Я здається здогадуюсь в чому проблема. SQLite зберігає дати як текст або цілі таймстемпи: https://www.sqlite.org/datatype3.html#d … e_datatype

А у вас нема жодного з датою 2018-08-21, всі з датами на зразок 2018-09-01 22:52:11.508213


Щодо питання чому код


Виводить через рядок?

Думаю тому що цикл це вже ітерація по курсору, а cur1.fetchone() - це ще один інкремент курсору.  Якби ви написали:

То воно напевне вивело би всі.

ДЯКУЮ!!! Ви праві.

Але в тоді виникає ще одне питання:
Я дату заношу в базу таким чином:

tt = datetime.datetime.now()
o = 1(і т.д. до 30)
dd = tt - datetime.timedelta(days=o)
       date_str = dd.strftime("%Y-%m-%d")

Чому воно тоді не відсікає годину "22:52:11.508213"?
коли роблю print("date_str=", date_str)
видає
date_str= 2018-09-03

без часу. Де воно бере його в такому випадку?
Дякую.

18

Re: Проблема з sqlite3.

Пробуйте cховати ваш код в тег code (про BBCode тут), тоді його буде зручніше читати.

Ну з того фрагменту що ви навели - не зрозуміло як дані опиняються в базі, бо в ньому ви  не заносите дату в базу, ви її заносите в змінну date_str, що ви заносите в базу - невідомо, тому важко сказати звідки такі дати взялись. :)

19

Re: Проблема з sqlite3.

bunyk написав:

Пробуйте cховати ваш код в тег code (про BBCode тут), тоді його буде зручніше читати.

Ну з того фрагменту що ви навели - не зрозуміло як дані опиняються в базі, бо в ньому ви  не заносите дату в базу, ви її заносите в змінну date_str, що ви заносите в базу - невідомо, тому важко сказати звідки такі дати взялись. :)

import datetime
import sqlite3

tt = datetime.datetime.now()
o = 1
md = int(input("md="))
conn1 = sqlite3.connect('D:\\free\\ft_G1.db')
cur1 =conn1.cursor()
cur1.execute('CREATE TABLE number (date1 VARCHAR, numd1 VARCHAR(2), numd2 INTEGER, numd3 VARCHAR(2), numd4 INTEGER, numd5 INTEGER, yn VARCHAR(1))')# Видалити id
conn1.commit()
conn2 = sqlite3.connect('D:\\free\\ft_G2.db')
cur2 =conn2.cursor()
cur2.execute('CREATE TABLE number (date1 VARCHAR, numd1 INTEGER, numd2 INTEGER, numd3 INTEGER, numd4 INTEGER, numd5 INTEGER, yn VARCHAR(1))')# Видалити id
conn2.commit()
while o <= md:
       dd = tt - datetime.timedelta(days=o)
       date_str = dd.strftime("%Y-%m-%d")
       fftt = "2018-08-25"
       bo = 'n'
       сur1.execute("INSERT INTO number (date1, yn) VALUES (:dd, :bo)", {"dd": date_str, "bo": bo})# Видалити id
       conn1.commit()
       cur2.execute("INSERT INTO number (date1, yn) VALUES (:dd, :bo)", {"dd": date_str, "bo": bo})  # Видалити id
       conn2.commit()
       o = o+1
conn1.close()
conn2.close()

Ось цей повністю код яким створюю БД.

20 Востаннє редагувалося verolim (04.09.2018 20:13:22)

Re: Проблема з sqlite3.

bunyk написав:

Пробуйте cховати ваш код в тег code (про BBCode тут), тоді його буде зручніше читати.

Ну з того фрагменту що ви навели - не зрозуміло як дані опиняються в базі, бо в ньому ви  не заносите дату в базу, ви її заносите в змінну date_str, що ви заносите в базу - невідомо, тому важко сказати звідки такі дати взялись. :)

Вибачайте, тільки що перевірив ще раз - усе нормально. Годин не пише.
А поясніть, будь ласка чи можна без конструкцій типу

conn1 = sqlite3.connect('D:\\free\\ft_G1.db')
cur1 =conn1.cursor()
rrr = ("SELECT numd2 FROM number WHERE date1='2018-08-20'")
cur1.execute(rrr)
select = str(cur1.fetchall())
s2=select[2]
print("select=", select, "type(select)=", type(select), "s2=", s2, "type(s2)=", type(s2))
s1= int((s2))
print("select=", select, "type(select)=", type(select), "s1=", s1, "type(s1)=", type(s1), "s2=", s2, "type(s2)=", type(s2))

отримати дані у типу int з комірки numd1, numd2 і тд. таблиці БД?
Типи даних в таблиці:

cur1.execute('CREATE TABLE number (date1 VARCHAR, numd1 INTEGER, numd2 INTEGER, numd3 VARCHAR(2), numd4 INTEGER, numd5 INTEGER, yn VARCHAR(1))')
Подякували: leofun011