Портал Python-программистов

Форумы сайта python.com.ua

Вы не зашли.

Объявление

Открыт официальный канал портала на pythonua@conference.jabber.ru читать подробности

#1 2007-03-14 08:08:55

kailito
Питонер
Зарегистрирован: 2007-03-14
Сообщений: 4
Рейтинг :   
Профиль

не работает insert & update в mysqldb

есть следующий код. В базу не заносит. Не ругается. мускль из консоли заносит. Индекс исправно увеличивает после выполнения сего кода, но кроме индеска ничего не меняется


#!c:\Python\python.exe
import os, sys, time, string
import MySQLdb
con = MySQLdb.connect(host="127.0.0.1", port=3306,
    user="test", passwd="test", db="test")
cursor = con.cursor( )
sql = "INSERT sync (ray,timepr,stan,com) VALUES (23,'20070314105501',0,25);"
print sql
cursor.execute(sql)
cursor.close()
con.close( )

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

Неактивен

 

#2 2007-03-14 08:14:20

lorien
Опытный web-ер
Откуда: Омск
Зарегистрирован: 2006-08-20
Сообщений: 247
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

Что значит "увеличивает индекс"? Вы имели в виду файл с индексами для таблицы sync или что?

Неактивен

 

#3 2007-03-14 08:23:55

kailito
Питонер
Зарегистрирован: 2007-03-14
Сообщений: 4
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

нет, primary key с автоинкрементом увеличивается.

Отредактированно kailito (2007-03-14 08:28:05)

Неактивен

 

#4 2007-03-14 08:47:12

Viper
Питонер
Зарегистрирован: 2006-11-08
Сообщений: 35
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

kailito, надо вызывать con.commit() после cursor.execute(sql) или настраивать MySQL на автокоммит.

Неактивен

 

#5 2007-03-14 09:05:14

Mkdir
Команда
Откуда: Киев, Украина
Зарегистрирован: 2006-06-30
Сообщений: 188
Рейтинг :   
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

Viper написал:

kailito, надо вызывать con.commit() после cursor.execute(sql) или настраивать MySQL на автокоммит.

+1 (опередили меня)

Неактивен

 

#6 2007-03-14 09:05:16

kailito
Питонер
Зарегистрирован: 2007-03-14
Сообщений: 4
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

хух! спасибо! чуть не поседел)

Отредактированно kailito (2007-03-14 09:07:11)

Неактивен

 

#7 2007-03-14 09:05:57

Mkdir
Команда
Откуда: Киев, Украина
Зарегистрирован: 2006-06-30
Сообщений: 188
Рейтинг :   
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

kailito написал:

Viper у меня же con.close( ), вроде все по букварю. Для пробы убрал всё после  cursor.execute(sql)  smile. Тоже, только в профиль. Может чего MySQLdb нужно достроить?

commit

Неактивен

 

#8 2007-03-14 09:08:08

kailito
Питонер
Зарегистрирован: 2007-03-14
Сообщений: 4
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

Mkdir
осознал и исправился) ещё раз всем спасибо!

Неактивен

 

#9 2007-03-19 06:57:30

proDiva
Питонер
Откуда: Черкесск
Зарегистрирован: 2007-02-15
Сообщений: 111
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

Есть такой sql-запрос:
"INSERT INTO fiz VALUES ('2000000000', 'Normal', 'Алина', '1982-04-07', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, ''); COMMIT"
На что выходит ошибка:
Traceback (most recent call last):
  File "C:\cb\frames.py", line 339, in OnButtonSave
    curs.execute(sql)
  File "C:\Python24\Lib\site-packages\MySQLdb\cursors.py", line 146, in execute
    query = query.encode(charset)
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 49-53: ordinal not in range(256)

посмотрела cursors.py, он перекодирует запрос в кодировке db..... перепроверила, везде в базе кодировка utf8. Не могу понять, в чем дело.


Ах вот ты какой, питончик аленький!))

Неактивен

 

#10 2007-03-19 09:13:21

balu
Питонер
Откуда: Гражданин Мира
Зарегистрирован: 2006-05-24
Сообщений: 143
Рейтинг :   
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

proDiva написал:

Не могу понять, в чем дело

Не зная мускуля, предположу, что вы не правильно написали запрос. Я бы писал так

Код: :sql:

INSERT INTO (field0, field1, ..., fieldN) VALUES (value0, value1, ..., valueN)

и делал бы не

, '', '', 0, ''); COMMIT"

, а

Код: :python:

cursor.commit()

в соответствие с API DB.

Еще можно попробовать убрать умолчальную кодировку в БД - посмотреть как она будет себя вести.
Еще: у тебя точно кодировки в базе и в запросе совпадают? выведи запрос в текстовый файл и проверь кодировку.

Отредактированно balu (2007-03-19 09:28:12)


Ничего излишнего! Мера - самое благородное!

Неактивен

 

#11 2007-03-19 09:40:36

Viper
Питонер
Зарегистрирован: 2006-11-08
Сообщений: 35
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

Эта ошибка точно связана с кодировками, можно попробовать использовать метод connection.set_character_set.

Неактивен

 

#12 2007-03-19 15:03:48

OlDer
Питонер
Зарегистрирован: 2006-07-19
Сообщений: 129
Рейтинг :   11 
Профиль

Re: не работает insert & update в mysqldb

proDiva написал:

Есть такой sql-запрос:
"INSERT INTO fiz VALUES ('2000000000', 'Normal', 'Алина', '1982-04-07', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, '')"

Насчет списка полей после INTO и commit вам уже написали. Ну и замените 'Алина' на u'Alina'.


http://www.sloganizer.net/en/image,python,white,green.png

Неактивен

 

#13 2007-03-19 22:14:49

pythonwin
Команда
Откуда: за компом
Зарегистрирован: 2006-07-18
Сообщений: 872
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

OlDer написал:

Насчет списка полей после INTO и commit вам уже написали. Ну и замените 'Алина' на u'Alina'.

думаю лучше явно задавать кодировку - unicode('Алина','cp1251')


...мир скучен для скучных людей. Сократ.
язык Python
framework TurboGears
форум по TurboGears

Неактивен

 

#14 2007-03-20 01:09:41

proDiva
Питонер
Откуда: Черкесск
Зарегистрирован: 2007-02-15
Сообщений: 111
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

balu написал:

Не зная мускуля, предположу, что вы не правильно написали запрос.

Запрос верный, в этом не сомневайтесь.

balu написал:

Еще можно попробовать убрать умолчальную кодировку в БД - посмотреть как она будет себя вести.

в бд везде кодировка utf8, а вот у сервера по умолчанию была latin1, поменяла на utf8.... ничего не изменило, при команде print con.character_set_name() все равно выводится latin1.

OlDer написал:

Ну и замените 'Алина' на u'Alina'.

не могу.... вся база должна быть на русском языке..... или вы предлагаете всех сотрудников банка заставить писать на латиннице?))
Я так предполагаю, что эта кодировка сидит где-то глубоко в сервере..... и наверно нужно переустановить сервер, но так не хочется)))
Метод: "con = MySQLdb.connect (host = "localhost",user = "root",db = "test",charset='utf8',use_unicode=True)
cur = con.cursor()
cur.execute("SET NAMES 'utf8'")"
не срабатывает, а если писать unicode('Алина','latin1') все проходит без ошибок, но потом вся база становится иероглифами


Ах вот ты какой, питончик аленький!))

Неактивен

 

#15 2007-03-20 01:20:54

balu
Питонер
Откуда: Гражданин Мира
Зарегистрирован: 2006-05-24
Сообщений: 143
Рейтинг :   
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

proDiva написал:

в бд везде кодировка utf8, а вот у сервера по умолчанию была latin1, поменяла на utf8.... ничего не изменило, при команде print con.character_set_name() все равно выводится latin1.

Поставь кодировку конкретной базы в None, правда, потом посмотри как будет работать upper с русскими буквами.


Ничего излишнего! Мера - самое благородное!

Неактивен

 

#16 2007-03-20 01:28:14

slivlen
Команда
Откуда: Подольск, Россия
Зарегистрирован: 2006-07-06
Сообщений: 534
Рейтинг :   36 
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

proDiva написал:

а если писать unicode('Алина','latin1')

Почему latin1? Там должна быть кодировка в которой вводится строка.
А вообще я для тестирования написал небольшой пример и он работает у меня без проблем.

Код: python:

#!/usr/bin/python
from MySQLdb import connections
 
db = connections.Connection(db='testing',host='localhost',user='user',passwd='pass')
db.set_character_set('utf8')
curs = db.cursor()
inp = unicode(raw_input(), 'utf-8')
curs.execute("insert into t values ('" + inp +"', 'some_text')")
row=curs.execute("select * from t")
for i in range(row):
    rw = curs.fetchone()
    print rw[0], rw[1]
 

Неактивен

 

#17 2007-03-20 02:06:53

proDiva
Питонер
Откуда: Черкесск
Зарегистрирован: 2007-02-15
Сообщений: 111
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

slivlen
Вы напишите, пожалуйста, такой же пример с данными на кириллице. Потому что примеры с латинницей у меня тоже работают.

slivlen написал:

Почему latin1? Там должна быть кодировка в которой вводится строка.

Потому что в модуле connections.py запрос перекодируется в кодировке базы, которая запрашивается таким образом:
"if not charset:
     charset = self.character_set_name()
self.set_character_set(charset)"
В базе везде упоминается utf8, но где-то все-таки сидит latin1, которая и выскакивает при запросе.


Ах вот ты какой, питончик аленький!))

Неактивен

 

#18 2007-03-20 02:11:49

slivlen
Команда
Откуда: Подольск, Россия
Зарегистрирован: 2006-07-06
Сообщений: 534
Рейтинг :   36 
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

proDiva написал:

Вы напишите, пожалуйста, такой же пример с данными на кириллице.

В raw_input я ввожу с консоли строку на русском. В результате в переменной inp - хранится строка с кириллицей. Так что разница между примерами не большая.

Код: python:

#!/usr/bin/python
#-*- coding: utf-8 -*-
from MySQLdb import connections
 
db = connections.Connection(db='coding',host='localhost',user='root',passwd='')
db.set_character_set('utf8')
curs = db.cursor()
#inp = unicode(raw_input(), 'utf-8')
inp = unicode('кириллица', 'utf-8')
curs.execute("insert into t values ('" + inp +"', 'some_text')")
 
row=curs.execute("select * from t")
for i in range(row):
    rw = curs.fetchone()
    print rw[0], rw[1]
 

Неактивен

 

#19 2007-03-20 02:57:40

proDiva
Питонер
Откуда: Черкесск
Зарегистрирован: 2007-02-15
Сообщений: 111
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

slivlen
Действительно, так сработало..... все без ошибок, но осталась загадка...... после команды con.set_character_set('utf8'), когда запрашиваю print con.character_set_name() все равно выходит latin1)))


Ах вот ты какой, питончик аленький!))

Неактивен

 

#20 2007-03-20 03:49:12

Viper
Питонер
Зарегистрирован: 2006-11-08
Сообщений: 35
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

proDiva написал:

после команды con.set_character_set('utf8'), когда запрашиваю print con.character_set_name() все равно выходит latin1)))

у меня тоже самое, похоже что это проблема библиотеки.

Неактивен

 

#21 2007-03-20 04:04:29

proDiva
Питонер
Откуда: Черкесск
Зарегистрирован: 2007-02-15
Сообщений: 111
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

Не знаю, что я сделала, но пример перестал работать, все та же ошибка:
Traceback (most recent call last):
  File "C:/cb/1.py", line 10, in -toplevel-
    curs.execute(sql)
  File "C:\Python24\Lib\site-packages\MySQLdb\cursors.py", line 146, in execute
    query = query.encode(charset)
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 64-68: ordinal not in range(256)

Вот код:

Код: :python:

#!/usr/bin/python
#-*- coding: utf-8 -*-
from MySQLdb import connections
 
db = connections.Connection(db='cb_test',host='localhost',user='root',passwd='1111')
db.set_character_set('utf8')
curs = db.cursor()
 
sql = unicode("INSERT INTO fiz (NUMBER, FIO, DataRozhd) VALUES ('2000000001', 'Алина', '1982-04-07'); COMMIT", 'utf-8')
curs.execute(sql)
 
row=curs.execute("select * from fiz where NUMBER = '2000000001';")
for i in range(row):
    rw = curs.fetchone()
    print rw[0], rw[1]

Ах вот ты какой, питончик аленький!))

Неактивен

 

#22 2007-03-20 09:24:07

Mkdir
Команда
Откуда: Киев, Украина
Зарегистрирован: 2006-06-30
Сообщений: 188
Рейтинг :   
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

Я смотрю на этом форуме люди не знают разницы между внутренним форматом питона, который называется unicode и кодировкой utf-8.
Так вот, unicode это не utf8, а utf8 это не unicode!

Unicode - это, как бы, внутренний формат питона, который позволяет хранить строки, в которых один символ может занимать несколько байтов (снова не путайте с utf8!).

Например нам нужно перевести текст из кодировки cp1251 в utf8.
Для этого необходимо сперва перевести текст во внутренний формат unicode, а затем из unicode нужно преобразовать в кодировку utf8.

Неактивен

 

#23 2007-03-20 12:34:32

slivlen
Команда
Откуда: Подольск, Россия
Зарегистрирован: 2006-07-06
Сообщений: 534
Рейтинг :   36 
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

Mkdir написал:

Я смотрю на этом форуме люди не знают разницы между внутренним форматом питона, который называется unicode и кодировкой utf-8.

Не очень понял из чего был сделан такой вывод. smile

Неактивен

 

#24 2007-03-21 01:07:33

proDiva
Питонер
Откуда: Черкесск
Зарегистрирован: 2007-02-15
Сообщений: 111
Рейтинг :   
Профиль

Re: не работает insert & update в mysqldb

Код: :python:

#!/usr/bin/python
# -*- coding: cp1251 -*-
 
from MySQLdb import connections
 
con = connections.Connection(db='cb_test',host='localhost',user='root',passwd='1111')
con.set_character_set('cp1251')
 
curs = con.cursor()
print con.character_set_name()
 
sql = "INSERT INTO fiz (NUMBER, FIO, DataRozhd) VALUES ('2000000001', 'Алина', '1982-04-07'); COMMIT"
sql1=unicode(sql, 'latin-1')
curs.execute(sql1)


Долго мучалась различными путями........ сработал данный конечный вариант, поздравьте меня! Причем команда con.set_character_set('cp1251') помогает базе не испортить кодировку.... т.е. все данные и старые, и новые остаются читабельными на русском языке.

Отредактированно proDiva (2007-03-21 01:12:19)


Ах вот ты какой, питончик аленький!))

Неактивен

 

#25 2007-03-21 01:27:14

slivlen
Команда
Откуда: Подольск, Россия
Зарегистрирован: 2006-07-06
Сообщений: 534
Рейтинг :   36 
Профиль  Вебсайт

Re: не работает insert & update в mysqldb

proDiva написал:

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

Поздравляю smile
Но зачем вот это?

Код: python:

sql1=unicode(sql, 'latin-1')

И почему latin-1?

Неактивен

 

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

Linux coutner