Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 26, 2011 18:24:27

МИша
От:
Зарегистрирован: 2011-04-19
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

Здарвствуйте, все!
Мне необходимо вставлять в базу Null значения
Прочитал (в каком-то мануале в интернете), что для этого нужно использовать None. Я понял это следующим образом

 
connection.cursor.execute("""INSERT INTO SOME_TABLE(NULLABLE) VALUES(None)""")
В ответ получил ошибку
_mysql_exceptions.OperationalError: (1054, “Unknown column ‘None’ in ‘field list’”)

Причем NULL значения из базы возвращаются в качестве None. В чем дело?



Офлайн

#2 Апрель 27, 2011 07:23:08

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

может так попробовать:

connection.cursor.execute("""INSERT INTO SOME_TABLE(NULLABLE) VALUES(?)""", (None,))



Офлайн

#3 Апрель 27, 2011 13:19:47

МИша
От:
Зарегистрирован: 2011-04-19
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

pyuser, я попробовал, так как Вы советовали. Кроме того хочу узнать, было ли это предположение или этот код у Вас работал и откуда Вы его взяли? Потому, что я не ничего не знаю о подобном спецификаторе ? и кроме того запятая в части выражения (?)“”",( очень удивляет, потому что на ее месте обычно стоит оператор %
Я попробовал следующие варианты:

connection.cursor.execute("""INSERT INTO SOME_TABLE(NULLABLE) VALUES(?)""", (None,))
TypeError: not all arguments converted during string formatting

connection.cursor.execute("""INSERT INTO SOME_TABLE(NULLABLE) VALUES(?)"""% (None,))
TypeError: not all arguments converted during string formatting

connection.cursor.execute("""INSERT INTO SOME_TABLE(NULLABLE) VALUES(%s)"""% (None,))
_mysql_exceptions.OperationalError: (1054, “Unknown column ‘None’ in ‘field list’”)

и
connection.cursor.execute("""INSERT INTO SOME_TABLE(NULLABLE) VALUES(%s)""", (None,))
Код прошел, но меня это не устраивает по следующим причинам:
connection.cursor.execute("""INSERT INTO SOME_TABLE(VARCHARABLE, NULLABLE) VALUES('%s', %s)""", ('TEST', None,))
_mysql_exceptions.ProgrammingError: (1064, “You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘TEST’', NULL)' at line 1”) (При этом видно, что значение NULL на месте)

Кроме того вместо значения None нужно вставлять еще и строку(к примеру varchar null)
а если написать
connection.cursor.execute("""INSERT INTO SOME_TABLE(NULLABLE) VALUES('%s')""", (None,))
получаю предупреждение __main__:1: Warning: Out of range value for column ‘NULLABLE’ at row 1
И несмотря на него в базу вставляется нулевое значение



Офлайн

#4 Апрель 27, 2011 17:06:33

МИша
От:
Зарегистрирован: 2011-04-19
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

Я нашел решение :D. Надо писать

connection.cursor.execute("""INSERT INTO SOME_TABLE(VARCHARABLE, NULLABLE, INTEGERABLE) VALUES(%s, %s, %s)""", ('TEST', None, 6))
То есть всегда без кавычек
Но все-таки, я не совсем понял про запятую и кортеж после строки. У М.Лутца вроде про такое нет



Офлайн

#5 Апрель 28, 2011 04:31:44

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

МИша
Но все-таки, я не совсем понял про запятую и кортеж после строки. У М.Лутца вроде про такое нет
При чем здесь Луц?! вот то что Вам нужно.



Офлайн

#6 Май 19, 2011 00:27:09

sligel
От:
Зарегистрирован: 2010-12-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

тоже проблемма с NULL, ни как не пойму как сделать чтоб получилось.
обрывок кода

def save_to_bd(self):

self.connect = sqlite3.connect(self.db_file)
self.cursor = self.connect.cursor()
print(self.txt_list)

sql = "INSERT INTO times VALUES("+self.txt_list['bus']+",'"+\
self.txt_list['haltestelle']+"','"+\
self.txt_list['richtung']+"','"+\
self.txt_list['w_day']+"','"+\
self.txt_list[0]+"','"+\
self.txt_list[1]+"','"+\
self.txt_list[2]+"','"+\
self.txt_list[3]+"','"+\
self.txt_list[4]+"','"+\
self.txt_list[5]+"','"+\
self.txt_list[6]+"','"+\
self.txt_list[7]+"','"+\
self.txt_list[8]+"','"+\
self.txt_list[9]+"','"+\
self.txt_list[10]+"','"+\
self.txt_list[11]+"','"+\
self.txt_list[12]+"','"+\
self.txt_list[13]+"','"+\
self.txt_list[14]+"','"+\
self.txt_list[15]+"','"+\
self.txt_list[16]+"','"+\
self.txt_list[17]+"','"+\
self.txt_list[18]+"','"+\
self.txt_list[19]+"','"+\
self.txt_list[20]+"','"+\
self.txt_list[21]+"','"+\
self.txt_list[22]+"','"+\
self.txt_list[23]+"')"

self.cursor.execute(sql)

self.connect.commit()
self.connect.close()
self.txt_list- это словарь со значениями например вот такими
——————–
{0: ‘28’,
1: ‘Null’,
2: ‘Null’,
3: ‘Null’,
4: ‘Null’,
5: ‘12 42’,
6: ‘12 38 57’
, 7: ‘17 37 57’
, 8: ‘17 37 57’,
9: ‘17 37 57’,
10: ‘17 37 57’,
11: ‘17 37 57’,
12: ‘17 37 57’,
13: ‘17 37 57’,
14: ‘17 37 57’,
15: ‘17 37 57’,
16: ‘17 37 57’,
17: ‘17 37 57’,
18: ‘17 37 57’,
19: ‘17 44’
, 20: ‘14 44’,
21: ‘14 42’
, 22: ‘12 42’,
23: ‘12 28 58’
, ‘richtung’: ‘Wahren’,
‘w_day’: ‘0 1 2 3 4’,
‘bus’: ‘90’,
‘haltestelle’: ‘ Bf. Wahren’}
————————
при попытке замены ‘Null’ на None выдает ошибку
Can't convert ‘NoneType’ object to str implicitly,
пытался сделать,
        sql = "INSERT INTO times VALUES({})".format(**self.txt_list)
так же не получается,ну тут уже с форматом что то не то .
ломаю голову, помогите друзья, хотяб ссылкой на мануалы какие нибудь



Офлайн

#7 Май 19, 2011 06:00:34

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

sligel
тоже проблемма с NULL, ни как не пойму как сделать чтоб получилось.
ломаю голову, помогите друзья, хотяб ссылкой на мануалы какие нибудь
Бросайте уже пхпшные привычки. Биндинг параметров для кого придумали?
cur.execute("insert into test(p) values (?)", (p,))
видите как значение в запрос подставляется?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Май 19, 2011 15:17:43

sligel
От:
Зарегистрирован: 2010-12-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

кое что начинаю понимать но не совсем

import sqlite3

li = (1,None,'2---')

db_connect = sqlite3.connect('test.sqlite')
cursor =db_connect.cursor()
#----------------------------------------------------------------------
# вставляю строку в таблицу test во все колонки,
# но если надо вставить 28 значений, то что, писать
# VALUES (28 вопросов), и потом соответственно
# 28 значений ? или как то можно покомпактнее
#----------------------------------------------------------------------
cursor.execute("INSERT INTO test VALUES (?,?,?)",(li[0],li[1],li[2]))


db_connect.commit()
db_connect.close()



Офлайн

#9 Май 20, 2011 05:28:32

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

sligel
#----------------------------------------------------------------------
# вставляю строку в таблицу test во все колонки,
# но если надо вставить 28 значений, то что, писать
# VALUES (28 вопросов), и потом соответственно
# 28 значений ? или как то можно покомпактнее
#----------------------------------------------------------------------
cursor.execute("INSERT INTO test VALUES (?,?,?)",(li[0],li[1],li[2]))
cursor.execute("INSERT INTO test VALUES (%s)" % ','.join(['?']*28), li)
А обязательно, кстати, во все поля вставлять? можно же явно поля перечислить, а для остальных DEFAULT прописать.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Май 20, 2011 05:38:38)

Офлайн

#10 Май 20, 2011 14:54:57

sligel
От:
Зарегистрирован: 2010-12-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQLdb Вставка NULL значений

PooH
А обязательно, кстати, во все поля вставлять? можно же явно поля перечислить, а для остальных DEFAULT прописать.
можно конечно и перечислять, но я подумал так прощще т.к значения например могут быть такими li = (1,None,“kk”), а в следующий раз
уже li = (None,2, “dd”).Спасибо за помощь буду тестить , как оно лучше.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version