SQLite3 / python:从VIEW而不是TABLE中选择时结果不同
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SQLite3 / python:从VIEW而不是TABLE中选择时结果不同,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1931字,纯文字阅读大概需要3分钟。
内容图文
![SQLite3 / python:从VIEW而不是TABLE中选择时结果不同](/upload/InfoBanner/zyjiaocheng/902/dbe4c28d7d644982b558c064b0a5b6ce.jpg)
所以我重构了一些代码来使用SQL视图,而不是在整个地方重复相同的查询.突然之间,一些单元测试开始失败,消息显示查询没有所有必需的属性.
所以,知道VIEW确实应该返回相同的结构(只需要几个过滤器),这很奇怪.我能够使用以下代码重现它:
#!/usr/bin/env python3
import sqlite3
db = sqlite3.connect(':memory:')
db.row_factory = sqlite3.Row
db.execute('CREATE TABLE foo(id INT PRIMARY KEY, alpha TEXT, beta TEXT)')
db.execute('CREATE VIEW foo_view AS SELECT * FROM foo')
db.execute("INSERT INTO foo(alpha, beta) VALUES ('hello', 'world')")
foo_res = [dict(r) for r in db.execute('SELECT "f"."alpha", "f"."beta" FROM "foo" "f"')]
foo_view_res = [dict(r) for r in db.execute('SELECT "f"."alpha", "f"."beta" FROM "foo_view" "f"')]
print(foo_res)
print(foo_view_res)
运行时,输出如下所示:
[{'alpha': 'hello', 'beta': 'world'}]
[{'f': 'hello'}]
在我看来,那些应该导致完全相同的字典.这里发生了什么?
python3和python2之间也有区别.在python2上运行时,输出如下:
[{'alpha': u'hello', 'beta': u'world'}]
[{'"f"."beta"': u'world', '"f"."alpha"': u'hello'}]
解决方法:
是的,这是一个问题.我的目的是解决方法.
该问题似乎仅限于引用select子句中的表别名.因此,没有这些引号,两个查询都在python 3中工作:
>>> [dict(r) for r in db.execute("select f.alpha, f.beta from foo f")]
[{'alpha': 'hello', 'beta': 'world'}]
>>> [dict(r) for r in db.execute("select f.alpha, f.beta from foo_view f")]
[{'f.alpha': 'hello', 'f.beta': 'world'}]
(注意:与表查询不同,视图会对别名产生影响.)
当引号被添加到select子句中的表别名时,事情就会出错:
>>> [dict(r) for r in db.execute("select 'f'.alpha, f.beta from foo_view as f")]
[{'f': 'hello', 'f.beta': 'world'}]
如果表名中确实有空格,您可以逃脱:
>>> [dict(r) for r in db.execute('select f."alpha", f."beta" from foo_view as "f"')]
[{'f."alpha"': 'hello', 'f."beta"': 'world'}]
但显然没有表别名中的空格,因为你需要引用它们.也就是说,我认为在表的别名中包含空格是不好的做法 – 并且表别名中没有空格可以跳过引用select子句中的表别名.
简而言之,解决方法不是引用表别名.
内容总结
以上是互联网集市为您收集整理的SQLite3 / python:从VIEW而不是TABLE中选择时结果不同全部内容,希望文章能够帮你解决SQLite3 / python:从VIEW而不是TABLE中选择时结果不同所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。