【问题标题】:Inserting into database but they are integers instead of strings and leading zeros I want to have vanish插入数据库,但它们是整数而不是字符串和前导零我想要消失
【发布时间】:2021-03-17 12:44:39
【问题描述】:

我正在尝试插入到我使用 python 3.9 在 sqlite3 创建的表中

cur.execute('CREATE TABLE name(id INTEGER, number TEXT, othernumber TEXT, morenumber INTEGER DEFAULT 0);')

conn.commit()

然后当我尝试从 python 插入一个包含前导 0 的字符串时,例如

cur.execute('INSERT INTO name VALUES({}, {}, {}, {});'.format(0, "0123", "034", 23)

conn.commit()

然后我查询以查看表格并得到

cur.execute('SELECT * FROM name')

data = cur.fetchall()

print(data)

我收到[(0, '123', '34', 23)]

缺少起始零。我检查了列的类型是否正确,它显示的是 TEXT。

【问题讨论】:

  • docs 中描述的值使用参数替换。对值使用字符串格式是不安全的。在这种情况下,这些值没有被正确引用,因此它们被解释为整数。

标签: python python-3.x sqlite sql-insert


【解决方案1】:

你的 SQL 语句被格式化成这个字符串:

INSERT INTO name VALUES(0, 0123, 034, 23);

由于没有引用这些值,因此它们被解释为数字,并且在转换为 text 之前省略了前导零。您可以通过引用它们将它们视为字符串...

cur.execute("INSERT INTO name VALUES({}, '{}', '{}', {});".format(0, "0123", "034", 23)
# Here ----------------------------------^--^--^--^

...但这可能不是最好的主意。

一个更强大的想法是停止依赖字符串格式并使用绑定变量:

cur.execute('INSERT INTO name VALUES(?, ?, ?, ?);', (0, "0123", "034", 23))

【讨论】:

  • 哦,谢谢你这么愚蠢的错误,是的,当我将它作为字符串传递给 f 字符串时,它省略了“非常感谢
猜你喜欢
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多