我正在处理一些来自嵌套字典的数据(通过 API)。 我想将数据存储到数据库中,我使用
psycopg2
来执行此操作,并编写了一些代码来组合我的 SQL 语句(“INSERT INTO mytable...”)。
到目前为止一切都运行良好,但有时数据并不包含所有必需的信息。在极少数情况下,其中一把钥匙丢失。这导致我的脚本崩溃。 所以我尝试了某种错误处理,因为在丢失数据的情况下,我只想用“NULL”代替。
但是,只有当我对每一条数据重复“try/ except 块”时,它才起作用。难道没有更简单的方法吗?
这是一个例子:
mydict = {'name': {'firstname': 'Peter', 'surname': 'Pan'}, 'contact': {'hometown': 'Neverland', 'phone': '123-456'}}
sql = f"INSERT INTO mytable(firstname, surname, phone)\nVALUES\n("
sql += f"'{mydict['name']['firstname']}',"
sql += f"'{mydict['name']['surname']}',"
sql += f"'{mydict['contact']['phone']}');"
对于丢失数据的情况我尝试过:
mydict = {'name': {'firstname': 'Peter', 'surname': 'Pan'}, 'contact': {'hometown': 'Neverland'}}
sql = f"INSERT INTO mytable(firstname, surname, phone)\nVALUES\n("
try:
sql += f"'{mydict['name']['firstname']}',"
except KeyError:
sql += 'NULL'
try:
sql += f"'{mydict['name']['surname']}',"
except KeyError:
sql += 'NULL'
try:
sql += f"'{mydict['contact']['phone']}');"
except KeyError:
sql += f"NULL);"
您可以将调用链接到
.get()
。例如,您可以这样做:
sql += mydict.get("name", {}).get("firstname", "NULL")
代替:
try:
sql += f"'{mydict['name']['firstname']}',"
except KeyError:
sql += 'NULL'
.get()
的第二个参数是密钥不存在的情况下的后备。对于第一次调用,我们返回一个空字典,这允许我们在第二次调用 "NULL"
时回退到 .get()
默认值。