有人能告诉我为啥这段代码似乎可以工作,但不能……拜托?

Posted

技术标签:

【中文标题】有人能告诉我为啥这段代码似乎可以工作,但不能……拜托?【英文标题】:Can someone tell me why this code seems to work but doesn't... please?有人能告诉我为什么这段代码似乎可以工作,但不能……拜托? 【发布时间】:2021-10-14 14:34:27 【问题描述】:

当我运行此代码时,我没有收到任何错误,一切似乎都正常,但实际上并没有写入数据库。如果我复制 print 函数生成的 sql 字符串并将其直接粘贴到 MariaDB 终端会话中,它可以完美运行。这是生成的sql:

INSERT INTO msg_store (cons, prod, file) VALUES ('XXX','YYY','ZZZ');

如果我更改数据库名称或任何必需的参数,我会得到预期的错误。 我已经在其他应用程序中成功使用了大部分代码。我在带有 Python3.7 的 Raspberry Pi 4 上运行它

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)

Run status screen from Pycharm

【问题讨论】:

没有报错吗?至少为我们提供打印/调试,以便我们可以为您提供更多帮助。 正如我在第一行中所说的,我没有收到任何错误,我得到的正是我所期望的,我什至得到了从“执行”函数返回的“1”。这是我运行它时的显示: sudo+ssh://pi@192.168.102.42:22/usr/bin/python3.7 -u /home/pi/pi-data-link/test 1 INSERT INTO msg_store (cons ,产品,文件)值('XXX','YYY','AAA');进程以退出代码 0 结束 【参考方案1】:

con.execute()之后你也应该做con.commit()之后你可以关闭连接

【讨论】:

谢谢! :-) 我必须从我的连接函数中返回连接和光标并提交连接对象。让我感到震惊的是,我上次使用这段代码时,正在连接一个不同的数据库引擎,显然不需要提交!非常感谢。 如果MrtByz解决了您的问题,那么建议至少upvote+accept(在这种情况下接受,因为您的声誉小于+25分)

以上是关于有人能告诉我为啥这段代码似乎可以工作,但不能……拜托?的主要内容,如果未能解决你的问题,请参考以下文章

Arduino IDE:“没有命名类型”,为啥我不能写这段代码? [复制]

有人能告诉我为啥这个方法会进入无限循环吗?

有人能告诉我为啥我的加密有效但我的解密无效吗?看下面的图片

有人能告诉我为啥当我的游戏中的相机移动时一切都会振动吗?

为啥我的按键动作不能正常工作?

为啥这段代码变慢了?