Может кто-нибудь сказать мне, почему этот код, кажется, работает, но не работает… пожалуйста?

#python-3.x #pymysql

Вопрос:

когда я запускаю этот код, я не получаю ошибок, и кажется, что все работает, но на самом деле он не записывается в базу данных. Если я скопирую строку sql, сгенерированную функцией печати, и вставлю ее непосредственно в сеанс терминала MariaDB, она будет работать идеально. Это sql, который генерируется:

ВСТАВЬТЕ В msg_store (минусы, prod, файл) ЗНАЧЕНИЯ («XXX»,»YYY»,»ZZZ»);

Если я изменю имя базы данных или любой из требуемых параметров, я получу ошибки, как и ожидалось. Я успешно использовал большую часть этого кода в других приложениях. Я запускаю его на Raspberry Pi 4 с Python3.7

 import pymysql

class C_DataBase: # Database Communication Class
    def __init__(self, host_ip, db_name, user_name, password, poll_time = None):
        self.ip = host_ip
        self.db = db_name
        self.un = user_name
        self.pw = password
        if poll_time is not None:
            self.pt = poll_time

def connect(db):
    try:
        con = pymysql.connect(host=db.ip,  # host
                             user=db.un,  # username
                             passwd=db.pw,  # password
                             db=db.db)  # name of the data base
        return con.cursor()  # Open the database and return

    except Exception as e:
       print('DBOpenError, Failed to Connect to={}, IP={}, user={}, pw={}'.format(db.db, db.ip, db.un, db.pw))

def pub_sql(db, cons, prod, msgb):
    con = connect(db)
    col = "cons, prod, file"
    val ="'"   cons   "','"   prod   "','"    msgb   "'"

    sql = "INSERT INTO msg_store ("   col   ") VALUES ("   val   ");"
    try:
        rslt = con.execute(sql)
        print(rslt, sql)
        con.close()
    except Exception as e:
        print('SQLWriteError={}'.format(e))


if __name__ == '__main__':
    db = C_DataBase('localhost', 'testdb', 'rpi', 'rpi') # Create and populate a database object
    pub_sql(db, 'XXX', 'YYY', 'AAA') # Call the publishing function
 

Терминальная сессия MariaDB

 ;MariaDB [testdb]> INSERT INTO msg_store (cons, prod, file) VALUES ('XXX','YYY','AAA');

Query OK, 1 row affected (33.852 sec)

MariaDB [testdb]>
MariaDB [testdb]> select * from testdb.msg_store;
 ------ ------ --------- 
| cons | prod | file    |
 ------ ------ --------- 
| ABC  | DEF  | message |
| ABC  | DEF  | message |
| XXX  | DEF  | message |
| XXX  | YYY  | ZZZ     |
| XXX  | YYY  | AAA     |
 ------ ------ --------- 
5 rows in set (0.001 sec)
 

Запустите экран состояния из Pycharm

Комментарии:

1. Нет ли какой-либо ошибки? По крайней мере, предоставьте нам печать/отладку, чтобы мы могли помочь вам больше.

2. как я уже говорил в первой строке, я не получаю ошибок, я получаю именно то, что ожидаю, я даже получаю «1», возвращаемое функцией «выполнить». Это дисплей, когда я его запускаю: sudo ssh://pi@192.168.102.42:22/usr/bin/python3.7 -u /home/pi/pi-канал передачи данных/тест 1 ВСТАВЬТЕ В msg_store (минусы, prod, файл) ЗНАЧЕНИЯ («XXX»,»YYY»,»AAA»); Процесс завершен с кодом выхода 0

Ответ №1:

После con.execute() того, как вы также должны это сделать con.commit() , после этого вы можете закрыть соединение

Комментарии:

1. Спасибо Тебе! 🙂 Мне пришлось вернуть как соединение, так и курсор из моей функции подключения и зафиксировать объект подключения. Что меня зацепило, так это то, что в последний раз, когда я использовал этот код, я подключался к другому ядру базы данных, которое, очевидно, не требовало фиксации! ОЧЕНЬ признателен.

2. Если MrtByz решил вашу проблему, то рекомендуется как минимум проголосовать принять (принять в этом случае, так как у вас репутация меньше 25 баллов)