Python - 如何插入 NULL mysql 值

标签 python sql

我正在使用 python 脚本生成带有插入语句的 sql 文件,但我不知道如何插入 NULL 值。

我有一个字典,其中键是列的名称,值是我要插入的值。 例如:

d = {"column1":"1", "column2":"test", "column3":None}

然后我想在我的插入语句中使用该值。

sqlfile.write("INSERT INTO test VALUES ('" + d["column1"] + "', '" + d["column2"] + "', '" + d["column3"] + "')")

但这将返回一个错误,因为无法连接非类型和字符串,如果我将 None 替换为“NULL”,它将在数据库中插入一个 0。

我该如何解决这个问题?

最佳答案

您正在插入 string 'NULL',而不是 NULL 值。如果这些值来自 Python 结构,则需要使用其他方法映射到 SQL 中的 NULL 值。

您可以为此使用None,并且只引用其他值:

def sqlquote(value):
    """Naive SQL quoting

    All values except NULL are returned as SQL strings in single quotes,
    with any embedded quotes doubled.

    """
    if value is None:
         return 'NULL'
    return "'{}'".format(str(value).replace("'", "''"))

sql = "INSERT INTO test VALUES ({column1}, {column2}, {column3})".format(
    **{k: sqlquote(v) for k, v in d.items()})

请注意,因为您必须以不同方式处理 None,所以您还必须处理正确的 SQL 引用!如果您的任何值直接或间接来自用户提供的数据,否则您将面临 SQL 注入(inject)攻击。

上面的sqlquote()函数应该满足SQLite strings ,它遵循标准的 SQL 引用规则。不同的数据库对此有不同的规则,因此请仔细检查您的文档

就我个人而言,我会使用 SQLAlchemy library生成 SQL 并让为您处理报价。您可以将其配置为为不同的数据库引擎生成 SQL。

关于Python - 如何插入 NULL mysql 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898130/

相关文章:

python - 仅使用 1 个 web dyno 和 0 个 worker dyno 运行 Heroku 后台任务

python - 如何停止本地日志记录,只保存到 wandb 的服务器并让 wandb 使用软链接(soft link)工作?

python - 确定python函数是否已更改

mysql - 将一个大的 SQL 文件分解为许多文件,从 MySQL 的主文件中执行

mysql - MySQL 查询中的 double

php - Laravel - 与多对多相关的附加列

python - 地理 Django 。管理员未在创建的实例中显示 point = models.PointField() 的 map 位置

sql - 同一张表上的 DB 笛卡尔积

php - 使用 Yii 的 CDbCriteria 的比较方法与空字符串

python - Django 创建的数据库表的权限