【问题标题】:Simple sqlite question简单的sqlite问题
【发布时间】:2010-11-10 17:42:19
【问题描述】:

当我使用时:

for i in Selection:
    Q = "SELECT columnA FROM DB WHERE wbcode='"+i+"' and commodity='1'"
    cursor.execute(Q)
    ydata[i] = cursor.fetchall()

我明白了:

ydata = {'GBR': [(u'695022',), (u'774291',), (u'791499',)... ]}

如何更改我的代码以获得:

ydata = {'GBR': [695022, 774291, 791499,...]}

非常感谢。 obs:这只是一个简化的例子。尽量不要对sql注入提出建议。

【问题讨论】:

  • +1 表示“尽量避免提出有关 sql 注入的建议”:)
  • 它不仅允许注入(如果 Selection 来自用户输入),它还会影响语句缓存。事实上,以正确的方式进行操作并不复杂,因此根本没有理由手动构建 SQL 语句。

标签: python sql sqlite


【解决方案1】:
[int(x[0]) for x in cursor.fetchall()]

【讨论】:

  • 有时我得到: ValueError: invalid literal for int(): NULL;你对解决这个问题有什么建议吗?
  • 添加到查询中:` and columnA is not null`
【解决方案2】:

基于您的这个和另一个问题,您需要了解 SQLite 的亲和性以及您如何填充数据库。其他数据库要求存储在列中的值都是相同类型的 - 例如所有字符串或所有整数。 SQLite 允许您存储任何内容,因此每行中的类型可以不同。

第一个近似值,如果你为该行输入一个字符串,那么你会得到一个字符串,输入一个整数,你会得到一个整数。在您的情况下,您正在取出字符串,因为您放入的是字符串而不是整数。

但是,您可以声明列关联,SQLite 会在您插入数据时尝试转换。例如,如果列具有整数亲和性,那么如果您插入的内容可以安全/正确地转换为整数,那么 SQLite 会这样做,因此字符串“1”确实将存储为整数 1,而“1 1”将被存储作为字符串“1 1”。

阅读此页面以了解详细信息。如果您使用正确的类型将数据放入其中,您会发现获取数据会容易得多。

http://www.sqlite.org/datatype3.html

如果您要导入 CSV 数据,则启动 APSW shell 并使用“.help import”来获取有关如何处理此问题的一些建议。

【讨论】:

  • 优秀。非常感谢。
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 2011-10-31
  • 2011-01-29
  • 2018-03-07
  • 2011-10-30
  • 2013-02-17
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多