Я решил этот вопрос со следующей работой. Он включал обработку возвращаемых байтовых литералов из столбцов удаленной базы данных, как показано в примере ниже, который я создал для объяснения ответа.
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(), которая вводила байтовые литералы? Если кто-нибудь знает, пожалуйста, отправьте его, чтобы помочь мне понять это дальше.
Есть ли у вас одинаковые версии python для обеих систем или python 2 на одном и python3 на другом? –
Я запускаю оба сценария на той же машине win8.1, используя python 3.4. Какие изменения связаны с удаленным MySQL db в GoDaddy с более старой версией MySQL. –