如何用Python将NULL数据插入MySQL数据库?

mlnl4t2r  于 2023-02-07  发布在  Mysql
关注(0)|答案(6)|浏览(230)

当我从Python脚本插入一些数据到MySQL时,我遇到了一个奇怪的错误。它基本上与我插入的变量为空有关。我认为MySQL不喜欢空变量,但是否有其他东西可以更改它,以便它与我的insert语句一起工作?
我可以成功地使用IF语句将它转换为0,如果它是空的,但这可能会打乱我计划在MySQL中做的一些数据分析。有没有办法将它转换为NULL或其他东西,使MySQL接受它,但不添加任何内容?

eanckbw9

eanckbw91#

当使用mysqldb和cursor.execute()时,传递值None,而不是"NULL"

value = None
cursor.execute("INSERT INTO table (`column1`) VALUES (%s)", (value,))

找到答案here

3bygqnnd

3bygqnnd2#

如果col1是char,col2是int,则技巧可能是:

insert into table (col1, col2) values (%s, %s) % ("'{}'".format(val1) if val1 else "NULL", val2 if val2 else "NULL");

您不需要将“”添加到%s,它可以在将值传递到sql之前进行处理。
此方法在使用sqlalchemy的会话执行sql时有效,例如session.execute(text(sql))
ps:sql尚未测试

oewdyzsn

oewdyzsn3#

关于在Python的SQL语句中使用参数的简单说明。请参阅RealPython关于此主题的文章-Preventing SQL Injection Attacks With Python。下面是www.example.com上的另一篇好文章-A Simple Approach To Templated SQL Queries In Python。这些文章帮助我解决了相同的None/NULL问题。TowardsDataScience.com - A Simple Approach To Templated SQL Queries In Python . These helped me with same None/NULL issue.
此外,我发现如果我将"NULL"(不带引号)直接放入VALUES中的INSERT查询中,它会在SQL Server DB中得到适当的解释。只有在需要有条件地添加NULL或通过字符串插值添加值时,才会存在转换问题。
示例:

cursor.execute("SELECT admin FROM users WHERE username = %s'", (username, ));

cursor.execute("SELECT admin FROM users WHERE username = %(username)s", {'username': username});

更新:这个StackOverflow的讨论更符合我正在尝试做的事情,可能会帮助其他人。
示例:

import pypyodbc
myData = [
    (1, 'foo'),
    (2, None),
    (3, 'bar'),
]
connStr = """
DSN=myDb_SQLEXPRESS;
"""
cnxn = pypyodbc.connect(connStr)
crsr = cnxn.cursor()
sql = """
INSERT INTO myTable VALUES (?, ?)
"""
for dataRow in myData:
    print(dataRow)
    crsr.execute(sql, dataRow)
cnxn.commit()
crsr.close()
cnxn.close()
aydmsdu9

aydmsdu94#

基于以上的回答,我为我的用例写了一个 Package 函数,你可以根据你的需要尝试改变这个函数。

def sanitizeData(value):
    if value in ('', None):
        return "NULL"

    # This case handles the case where value already has ' in it (ex: O'Brien). This is how SQL skils single quotes
    if type(value) is str: 
        return "'{}'".format(value.replace("'", "''"))

    return value

现在这样调用SQL查询,

"INSERT INTO %s (Name, Email) VALUES (%s, %s)"%(table_name, sanitizeData(actual_name), sanitizeData(actual_email))
oxiaedzo

oxiaedzo5#

为什么不将变量设置为'no price'之类的字符串,然后在以后对数字进行数学运算时将其过滤掉呢?

filter(lambda x: x != 'no price',list_of_data_from_database)
pes8fvy9

pes8fvy96#

快速检查是否为空,如果为空,则将其设置为NULL:

if(!variable_to_insert)
    variable_to_insert = "NULL"

...然后确保insert语句中插入的变量没有用引号括起来,例如:

insert = "INSERT INTO table (var) VALUES (%s)" % (variable_to_insert)
...

不像:

insert = "INSERT INTO table (var) VALUES ('%s')" % (variable_to_insert)
...

相关问题