2015-01-09 5 views
0

У меня есть python script, который работает нормально только при подключении к моей локальной тестовой машине, имеющей MySQL 5.6 базы данных на Windows 8.1, используя pymysql подключение. Select query/fetchal() возвращает кортежи типа ('1', '2015-01-02 23:11:19', '25 .00 ').подключения pymysql выберите запрос и fetchall возвращения кортежа, который имеет байты литералы как b'25.00' , а не строки, как '25 .00'

Однако, когда я использую один и тот же сценарий, слегка измененный, чтобы включать второе соединение с удаленной базой данных MySQL 5.0.96 производства, работающие на сервере Linux, он возвращает tuples как (В'1' , b'2015-01-02 23: 11:19 ', b'25.00'), и сценарий работает неправильно, поскольку условия соответствия и запросы с использованием возвращенных кортежей не выполняются.

Любая идея, почему и как я могу ее вернуть, возвращает tuples со значениями столбцов, у которых нет префикса «b»?

+0

Есть ли у вас одинаковые версии python для обеих систем или python 2 на одном и python3 на другом? –

+0

Я запускаю оба сценария на той же машине win8.1, используя python 3.4. Какие изменения связаны с удаленным MySQL db в GoDaddy с более старой версией MySQL. –

ответ

0

Я решил этот вопрос со следующей работой. Он включал обработку возвращаемых байтовых литералов из столбцов удаленной базы данных, как показано в примере ниже, который я создал для объяснения ответа.

conn = pymysql.connect(host=myHost, port=myPort, user=myUser, passwd=myPassword, database=myDatabase, charset="utf8") 
cur = conn.cursor() 

theDateTime = re.sub(r' ', '-', str(datetime.now())) 
theDateTime = theDateTime[0:10] + " " + theDateTime[11:19] 

productName = 'abc' 
myMaxPrice = 100.0 

try: 
    # The below query to the remote database returned tuples like (b'1', b'2015-01-02 23:11:19', b'25.00') for MySQL DB tableA columns: ID, date_changed, price 
    query = "SELECT IFNULL(ID,''), IFNULL(date_changed,''), IFNULL(price, '') FROM tableA WHERE product = '" + productName + "';" 
    cur.execute(query) 
    for r in cur.fetchall(): 
     # Given the returned result tuple r[] from the remote DB included byte literals instead of strings, I had to encode the '' strings in the condition below to make them byte literals 
     # However, I did not have to encode floats like mMaxyPrice and float(r[2]) as they were not a string; float calculations were working fine, even though the returned float values were also byte literals within the tuple 
     if not r[1] and float(r[2]) >= myMaxPrice: 
      #Had to encode and then decode r[0] below due to the ID column value r[0] coming back from the remote DB query/fetchall() as a byte literal with a "b" prefix 
      query = "UPDATE tableA SET date_changed = '" + theDateTime + "', price = " + str(myMaxPrice) + " WHERE ID = " + r[0].decode(encoding='utf-8') + ";" 
      cur.execute(query) 
      conn.commit() 
except pymysql.Error as e: 
    try: 
     print("\nMySQL Error {0}: {1}\n".format(e.args[0], e.args[1])) 
    except IndexError: 
     print("\nMySQL Index Error: {0}\n".format(str(e))) 
    print("\nThere was a problem reading info from the remote database!!!\n") 

Благодаря m170897017 за указание на эти являются байтовые литералов и Neha Шукла за помощь прояснить. Мне все равно было бы интересно узнать, почему удаленная база данных возвращает байтовые литералы, а не строки, возвращаемые локальной базой данных. Есть ли определенная кодировка, которую мне нужно использовать для подключения к удаленной БД и как? Это старая версия MySQL, используемая в удаленной базе данных, которая вызвала это? Разве это разница между удаленным Linux и Windows? Или это функция fetchall(), которая вводила байтовые литералы? Если кто-нибудь знает, пожалуйста, отправьте его, чтобы помочь мне понять это дальше.

0

b префикс означает байтовый литерал в Python3. Попробуйте преобразовать его в строку.

... 
res = (b'1', b'2015-01-02 23:11:19', b'25.00') 
new_res = [] 
for i in res: 
    new_res.append(i.decode(encoding='utf-8')) 

new_res = tuple(new_res) 
... 
+0

попробовал это, и эта строка: new_res.append (i.decode ('utf-8')) дает ошибку: AttributeError: объект 'str' не имеет атрибута 'decode' –

+0

@MichaelD. Кажется, это хорошо от myside. Попробуйте другой способ. Проверьте мое обновление. –

+0

Я использую eclipse с Pydev, и он жалуется: Неопределенная переменная: unicode. Нужно ли мне что-то импортировать? –

 Смежные вопросы

  • Нет связанных вопросов^_^