Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Базы данных > Пробуем на вкус MySQL.


Автор: proDiva 20.10.2006, 10:48
Код

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import string
from MySQLdb import connections

def Connect(db,host,user,password):
    db=connections.Connection(db=db, host=host, user=user, passwd=password)
    return db.cursor()
    
def Select(curs):
    row=curs.execute("SELECT * from fiz;")
    rw=curs.fetchone()
    for i in range(row):
        rw=curs.fetchone()
        print rw

curs=Connect('test','localhost','root','pass')
Select(curs)


Не получается записать результаты в файл стандартными методами (вместо вывода на экран). Может есть специальные для данного случая?

Автор: slivlen 20.10.2006, 13:20
Код

def Select(curs):
    f=open('backup', 'w')
    row=curs.execute("SELECT * from fiz;")
    rw=curs.fetchone()
    for i in range(row):
        rw=curs.fetchone()
        f.write(','.join(rw))
    f.close()

Автор: Artemios 20.10.2006, 13:39
Код

$ python myprogram.py > log.txt

шутка smile

Автор: proDiva 20.10.2006, 13:55
slivlen, вот что выдал:

Traceback (most recent call last):
  File "C:\MySQL_proba\1.py", line 25, in -toplevel-
    Select(curs)
  File "C:\MySQL_proba\1.py", line 19, in Select
    t.write(','.join(rw))
TypeError: sequence expected, NoneType found

про это я и говорила, что стандартные методы не сработали smile 
Может есть еще варианты?

Artemios, оценила)))

Автор: slivlen 20.10.2006, 14:43
Хех... А зачем rw=curs.fetchone() перед циклом? У тебя из-за этого выход за пределы массива происходит и fetchone возвращает None. 
Еще кстати каждый элемент надо к строке приводить.
Код

def Select(curs):
    f=open('backup', 'w')
    row=curs.execute("SELECT * from fiz;")
    for i in range(row):
        rw=curs.fetchone()
        f.write(','.join([ str(r) for r in rw]))
    f.close()



Автор: proDiva 20.10.2006, 15:15
Цитата(slivlen @  20.10.2006,  14:43 Найти цитируемый пост)
Хех... А зачем rw=curs.fetchone() перед циклом? У тебя из-за этого выход за пределы массива происходит и fetchone возвращает None. 

Это не моя идея, взяла пример здесь: http://python.com.ua/doc/mysqldb.html

Автор: slivlen 20.10.2006, 15:31
Цитата(proDiva @  20.10.2006,  15:15 Найти цитируемый пост)
Это не моя идея, взяла пример здесь: Использование модуля MySQLdb
Там все правильно. Сначало идет вывод результатов, а потом очередной fetchone. Ты просто строки местами поменяла, вот и ошибка появилась smile

Автор: proDiva 20.10.2006, 15:34
Не спорю, я часто ошибаюсь, спасибо за помощь.
Еще вопрос..... кодировка utf-8...... в базе все на русском отлично вижу, а возвращает одни вопросы (символы). Видимо, где-то еще нестыковка?

Автор: slivlen 20.10.2006, 15:41
У меня тоже было такое. Посмотри решение здесь: http://softwaremaniacs.org/forum/viewtopic.php?id=175

Автор: proDiva 20.10.2006, 16:22
Попробовала создать новую базу и явно задать кодировку....... все равно возвращает вопросы smile 

Автор: slivlen 20.10.2006, 16:44
Попробуй зделать еще так:
Код

def Select(curs):
    f=open('backup', 'w')
    curs.execute("set character set utf8")
    row=curs.execute("SELECT * from fiz;")
    for i in range(row):
        rw=curs.fetchone()
        f.write(','.join([ str(r) for r in rw]))
    f.close()

Автор: proDiva 20.10.2006, 16:44
Причем как бы явно не задавалась кодировка cp1251.... латиница замечательно выходит.

Добавлено @ 16:49 
slivlen, последний вариант сработал...... выражаю искеннюю благодарность от лица всего коллектива smile 
Но все-таки интересно, почему так сработало?

Автор: proDiva 25.12.2006, 12:49
Код

import sys
import string
import pysqlite2 as db
from MySQLdb import connections

def Connect(db,host,user,password):
    con=connections.Connection(db=db, host=host, user=user, passwd=password)
    return con.cursor()
    
def Select(curs):
    curs.execute("set character set cp1251")
    row=curs.execute("SELECT * from fiz;")
    rw=curs.fetchone()
   
def Insert(curs):
    row=curs.execute("INSERT INTO fiz (FIO) VALUES ('life')")
    
curs=Connect('alina','192.168.200.165','root','1111')
Select(curs)
curs.execute("set character set utf8")
Insert(curs)


Что не так? Не хочет вставлять запись smile 

Автор: _Viper_ 25.12.2006, 15:20
Цитата(proDiva @  25.12.2006,  12:49 Найти цитируемый пост)
Что не так? Не хочет вставлять запись  

а commit вызывать не надо?

Автор: proDiva 26.12.2006, 12:11
Честно говоря, не знаю, что делает эта команда...... что-то типа "сохранить"?

Автор: _Viper_ 26.12.2006, 14:02
Цитата(proDiva @  26.12.2006,  12:11 Найти цитируемый пост)
Честно говоря, не знаю, что делает эта команда...... что-то типа "сохранить"?
да это команда на сохранение изменений. 
В принципе сервер может быть сконфигурирован так чтобы вызывать commit после каждой транзакции автоматически. Если нет, то надо вызывать commit самому. 
В MySQLdb commit это метод Connection объкта. Попробуй его вызвать после INSERT.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)