#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)
Комментарии:
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 баллов)