无法使用 python 在 mysql 数据库中正确插入 NULL 值

Can not properly insert NULL value in mysql database using python

提问人:SomeRandomDude111 提问时间:9/27/2023 更新时间:9/29/2023 访问量:49

问:

我使用 json 格式发送数据,这是我的代码片段,它返回一个错误

    def blocks_files(self, db, order_id, op_id, file_ids, images):
        """Creating record in blocks_files table."""
        files_list = []
        keys = list(images.keys())
        for file in file_ids:
            if str(file) in keys:
                new = str()
                for i in range(len(images[str(file)])):
                    new += '%s, ' % str((images[str(file)])[i])
                files_list.append((order_id, op_id, file, new))
            else:
                files_list.append((order_id, op_id, file, None))
        try:
            logging.debug(
                "Inserting data in blocks_files table."
            )
            cursor = db.cursor()
            query = (
                f"INSERT INTO {self.FILES_TABLE}"
                f"(order_id, op_id, file_id, imgs)"
                f"VALUES {(', '.join(map(str, files_list)))};"
            )
            cursor.execute(query)
            db.commit()
            cursor.close()
            logging.debug(
                "Data inserted successfully!"
            )
        except connector.Error as err:
            logging.error(err)

问题出在部分地方。起初似乎一切正常,但我在日志中出现错误。但是我希望它应该将 NULL 放在 imgs 列中......我用下面的主题作为灵感,但没有用。尝试将“NULL”作为字符串发送不是我想要的,我需要正确的 SQL NULL 值,区别在于屏幕截图上正确的 NULL“NULL”值files_list.append((order_id, op_id, file, None))1054 (42S22): Unknown column 'None' in 'field list'

python mysql json sql-null

评论

0赞 buran 9/27/2023
不要像这样使用 str 方法自己构造 INSERT 语句
0赞 snakecharmerb 9/27/2023
我建议查看如何在 Python 的 SQL 语句中使用变量?,以获取有关如何在 SQL 语句中使用变量值的指导。这将使您获得所需的行为。NULL
0赞 SomeRandomDude111 9/27/2023
@snakecharmerb为什么我应该在imgs列中插入NULL时出现“'字段列表'中的未知列'无'”错误?我显然没有 None 列,也从未在代码中引用过它
0赞 snakecharmerb 9/27/2023
因为 SQL 假定 values 子句中不带引号的字符串是列名。

答:

0赞 SomeRandomDude111 9/29/2023 #1

我通过添加一个变量和两个语句来找到一个不太优雅的解决方案来解决我的问题if

def blocks_files(self, db, order_id, op_id, file_ids, images):
            """Creating record in blocks_files table."""
            files_list = []
            files_list_no_imgs = []
            keys = list(images.keys())
            for file in file_ids:
                if str(file) in keys:
                    images_list = str()
                    for i in range(len(images[str(file)])):
                        images_list += '%s, ' % str((images[str(file)])[i])
                    files_list.append((order_id, op_id, file, images_list))
                else:
                    files_list_no_imgs.append((order_id, op_id, file))
            try:
                logging.debug(
                    "Inserting data in blocks_files table."
                )
                cursor = db.cursor()
                if files_list:
                    query = (
                        f"INSERT INTO {self.FILES_TABLE}"
                        f"(order_id, op_id, file_id, imgs)"
                        f"VALUES {(', '.join(map(str, files_list)))};"
                    )
                    cursor.execute(query)
                if files_list_no_imgs:
                    query = (
                        f"INSERT INTO {self.FILES_TABLE}"
                        f"(order_id, op_id, file_id)"
                        f"VALUES {(', '.join(map(str, files_list_no_imgs)))};"
                    )
                    cursor.execute(query)
                db.commit()
                cursor.close()
                logging.debug(
                    "Data inserted successfully!"
                )
            except connector.Error as err:
                logging.error(err)