Найти - Пользователи
Полная версия: не работает insert & update в mysqldb
Начало » Базы данных » не работает insert & update в mysqldb
1 2 3
Mkdir
Я смотрю на этом форуме люди не знают разницы между внутренним форматом питона, который называется unicode и кодировкой utf-8.
Так вот, unicode это не utf8, а utf8 это не unicode!

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

Например нам нужно перевести текст из кодировки cp1251 в utf8.
Для этого необходимо сперва перевести текст во внутренний формат unicode, а затем из unicode нужно преобразовать в кодировку utf8.
slivlen
Mkdir
Я смотрю на этом форуме люди не знают разницы между внутренним форматом питона, который называется unicode и кодировкой utf-8.
Не очень понял из чего был сделан такой вывод. :)
proDiva

#!/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') помогает базе не испортить кодировку…. т.е. все данные и старые, и новые остаются читабельными на русском языке.
slivlen
proDiva
Долго мучалась различными путями…….. сработал данный конечный вариант, поздравьте меня!
Поздравляю :)
Но зачем вот это?
sql1=unicode(sql, 'latin-1')
И почему latin-1?
proDiva
slivlen
Но зачем вот это?
Код: python:
sql1=unicode(sql, ‘latin-1’)
И почему latin-1?
На этот вопрос ответить не могу.
Переустановила MySQL, при установке задала кодировку utf8 по умолчанию……. заново поставила базу с кодировкой utf8……. в общем ни в одном месте не встретилась кодировка latin1….. запрашиваю print con.character_set_name() - выходит все равно latin1 и он требует перекодировать sql-запрос в latin1…….. вот такая заморочка!)) Кстати, я тут выше писала про тонкость с con.set_character_set('cp1251')…… в этом месте кодировка не имеет значения, проходит любая лишь бы совпадала с # -*- coding: cp1251 -*-……. это все, что я сообразила))))
proDiva
Мне кажется, все дело в пакете MySQLdb…… есть же его разные модификации, даже под разными наименованиями. Может у меня его старая версия…. типа недоработанная)))) правда я сейчас уже не смогу сказать, откуда я его скачивала…… называется MySQL-python.exe-1.2.1_p2.win32-py2.4.exe
slivlen
proDiva
Может у меня его старая версия…. типа недоработанная))))
Это предпоследняя версия, кажется. Свой тестовый скрипт я на этой же версии(правда под linux) проверял.
Geo
была подобная проблема

косяк помоему в MySQLdb, он не понимает cp1251
решение: работаем в utf8,

#!/usr/bin/env python
# -*- coding: utf8 -*-

MySQL сам переведет нам из cp1251 в utf8

db = dbMySQL(host=“localhost”,port=3006,user=“user”,passwd=“password”,db=“dbname”,use_unicode=True,charset='utf8')

и далее плюем на latin1


sql = “insert into %s (Name) values ('%s')” % (self.tb, Name)
c=self.db.db.cursor(DictCursor)
c.execute(sql)
self.db.db.commit()

MySQLdb: python.exe-1.2.2.win32-py2.4.exe
proDiva
Парни, я полностью переписала модуль подключения к базе и все работает без перекодировок. И кстати отлично ладим с cp1251. Даю пример:

#!/usr/bin/python
# -*- coding: cp1251 -*-
“”“Функции обращения к серверу”“”

import sys
import string
import MySQLdb
from MySQLdb import connections

try:
db, host, user, password, otdel = open(“./connect.cfg”).read().split()
except ValueError, x:
print “Неверный формат подключения к базе данных!”, x

class mydb:
def Insert(self,tip,var):
con = connections.Connection(db=db, host=host, user=user, passwd=password)
con.set_character_set('cp1251')
curs = con.cursor()
try:
if tip == ‘fiz’ or tip == ‘fiz_ar’ or tip == ‘fiz_tmp’:
sql = curs.execute(“”“INSERT INTO ”“”+tip+“”“
VALUES (
%(num)s, %(stat)s, %(fam)s, %(droj)s, %(mroj)s, %(graj)s,
%(adreg)s, %(adfak)s, %(dok)s, %(migr)s, %(inost)s, %(drlico)s,
%(inn)s, %(tel)s, %(risk)s, %(orisk)s,%(dotkr)s, %(sotkr)s,
%(sutv)s, %(kur)s, %(dzap)s, %(dobn)s, %(hran)s, %(szap)s,
%(zakr)s, %(dzakr)s);”“”, var)
elif tip == ‘ur’ or tip == ‘ur_ar’ or tip == ‘ur_tmp’:
sql = curs.execute(“”“INSERT INTO ”“”+tip+“”“
VALUES (
%(num)s, %(stat)s, %(name)s, %(opf)s, %(orgn)s, %(dreg)s,
%(mreg)s, %(regor)s, %(adfak)s, %(adpoch)s, %(svor)s, %(kap)s,
%(drlico)s, %(svlic)s, %(dover)s, %(tel)s, %(bik)s, %(irez)s,
%(inerez)s, %(kody)s, %(risk)s, %(orisk)s, %(dotkr)s, %(sotkr)s,
%(sutv)s, %(kur)s, %(dzap)s, %(dobn)s, %(hran)s, %(szap)s,
%(zakr)s, %(dzakr)s);”“”, var)
elif tip == ‘predpr’ or tip == ‘predpr_ar’ or tip == ‘predpr_tmp’:
sql = curs.execute(“”“INSERT INTO ”“”+tip+“”“
VALUES (
%(num)s, %(stat)s, %(fam)s, %(droj)s, %(mroj)s, %(graj)s,
%(adreg)s, %(adfak)s, %(dok)s, %(svreg)s, %(svlic)s, %(drlico)s,
%(tel)s, %(inn)s, %(risk)s, %(orisk)s, %(dotkr)s, %(sotkr)s,
%(sutv)s, %(kur)s, %(dzap)s, %(dobn)s, %(hran)s, %(szap)s,
%(zakr)s, %(dzakr)s);”“”, var)
except ValueError, x:
print “Ошибка выполнения вставки новых данных!”, x
con.commit()
con.close()
return

Когда у питоши требуешь правильными командами, тогда и он не требует говорить ему на другом языке)))
Причем этот модуль работает независимо от кодировки базы (я экспериментировала, у меня срабатывает).
KarDer_Groom
Уважаемые, у меня похожая проблема, но решить её не могу, если вы смогли разобраться с этой проблемой, то может и моя вам окажется по зубам. Здесь моя тема http://python.su/forum/viewtopic.php?pid=36842#p36842

Извините если не в тему, или кому помешал.
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