首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能停止sqlite将双引用标识符视为字符串?

问是否有可能停止sqlite将双引用标识符视为字符串?
EN

Stack Overflow用户
提问于 2013-01-23 13:55:37
回答 2查看 210关注 0票数 4

根据:keywords.html

如果您这样做,SQLite3会做您期望的事情:

代码语言:javascript
复制
select "foo" from bar;

但是,如果标识符不存在:

代码语言:javascript
复制
select "non-existant" from bar;

它回过头来(为了与旧版本的兼容性,我猜)将引用的文本视为字符串。

这会给我带来问题,因为我使用这样的引用列动态地创建查询,而后一种行为则返回无意义的结果,而不是抛出错误。

我正在编写python代码,并使用一个封装PEP-249 Python数据库API规范v2.0模块的模块,这样我就可以在必要时输入特定于数据库的黑客。

我们的后端数据库可能会发生变化(实际上,在某些时候,本地测试和生产可能会有所不同),所以如果可能的话,我希望保持SQL本身的标准。

我能不能:

  • 停止/停止这种行为
  • 很容易/可靠地检测到已经发生了这种情况(并且引发我自己的异常,比如说)
  • 以某种方式解决这个问题(我不认为用非标准的等效的sql替换“是很容易以一种安全的方式编程实现的)。”
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-23 15:02:15

如果列名以表名或别名作为前缀,则不能误解它们:

代码语言:javascript
复制
SELECT bar."foo", a."baz" FROM bar, blah AS a

当您处理多个表时,可能需要使用它来避免列名冲突。

票数 2
EN

Stack Overflow用户

发布于 2013-01-23 14:00:14

不要使用引号,使用[和]

代码语言:javascript
复制
sqlite> create table blah (name text);
sqlite> select "something" from blah;
sqlite> select "name" from blah;
sqlite> insert into blah values ('hello');
sqlite> select "something" from blah;
something
sqlite> select "name" from blah;
hello
sqlite> select [something] from blah;
Error: no such column: something
sqlite> select [name] from blah;
hello
sqlite> 

试图以编程方式实现:

代码语言:javascript
复制
import re
from itertools import cycle

s = 'select "something" from blah;'
sel, cols, rest = re.match(r'(select)\s+(.*?)\s+(from\s+.*)', s).groups()
cols = re.sub('"', lambda g, I=cycle('[]'): next(I), cols)
print ' '.join( (sel, cols, rest) )
# select [something] from blah;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14481456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档