Найти - Пользователи
Полная версия: MySQLdb Вставка NULL значений
Начало » Базы данных » MySQLdb Вставка NULL значений
1
МИша
Здарвствуйте, все!
Мне необходимо вставлять в базу Null значения
Прочитал (в каком-то мануале в интернете), что для этого нужно использовать None. Я понял это следующим образом
 
connection.cursor.execute("""INSERT INTO SOME_TABLE(NULLABLE) VALUES(None)""")
В ответ получил ошибку
_mysql_exceptions.OperationalError: (1054, “Unknown column ‘None’ in ‘field list’”)

Причем NULL значения из базы возвращаются в качестве None. В чем дело?
pyuser
может так попробовать:
connection.cursor.execute("""INSERT INTO SOME_TABLE(NULLABLE) VALUES(?)""", (None,))
МИша
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
И несмотря на него в базу вставляется нулевое значение
МИша
Я нашел решение :D. Надо писать
connection.cursor.execute("""INSERT INTO SOME_TABLE(VARCHARABLE, NULLABLE, INTEGERABLE) VALUES(%s, %s, %s)""", ('TEST', None, 6))
То есть всегда без кавычек
Но все-таки, я не совсем понял про запятую и кортеж после строки. У М.Лутца вроде про такое нет
pyuser
МИша
Но все-таки, я не совсем понял про запятую и кортеж после строки. У М.Лутца вроде про такое нет
При чем здесь Луц?! вот то что Вам нужно.
sligel
тоже проблемма с 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)
так же не получается,ну тут уже с форматом что то не то .
ломаю голову, помогите друзья, хотяб ссылкой на мануалы какие нибудь
PooH
sligel
тоже проблемма с NULL, ни как не пойму как сделать чтоб получилось.
ломаю голову, помогите друзья, хотяб ссылкой на мануалы какие нибудь
Бросайте уже пхпшные привычки. Биндинг параметров для кого придумали?
cur.execute("insert into test(p) values (?)", (p,))
видите как значение в запрос подставляется?
sligel
кое что начинаю понимать но не совсем
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()
PooH
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 прописать.
sligel
PooH
А обязательно, кстати, во все поля вставлять? можно же явно поля перечислить, а для остальных DEFAULT прописать.
можно конечно и перечислять, но я подумал так прощще т.к значения например могут быть такими li = (1,None,“kk”), а в следующий раз
уже li = (None,2, “dd”).Спасибо за помощь буду тестить , как оно лучше.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB