Python 中使用 sqlite3, 字符串中包含变量怎么写

2020-07-17 09:58:32 +08:00
 youthfire

df = pd.DataFrame(pd.read_sql('select * from f65 where offer ' '+' in offervalue, conn))

其中 offervalue 是一个变量,具体就是一个列表.我想给予的条件是 offer 号必须在 offervalue 这个列表里

运行提示错误:pandas.io.sql.DatabaseError: Execution failed on sql 'False': operation parameter must be str

如果我在'select * from f65 where offer ' '+' in offervalue 外面加双引号,变量就变成字符串了.

2416 次点击
所在节点    Python
12 条回复
linuxkj
2020-07-17 10:05:39 +08:00
引用变量?如果还是 python 的语法,格式化不就行了吗,%s 或着 format 方法
'select * from f65 where offer in %s' %(offervalue)
InkStone
2020-07-17 10:06:33 +08:00
你先别考虑 pd 啊 sqlite3 啊什么的东西……先学习一下 Python 的基本语法。

第一个语句传入的第一个参数是 False,根本不是一个字符串……
nightv2
2020-07-17 10:12:02 +08:00
我数了一下单引号,好像括号里面不能组成一个字符串吧?
crella
2020-07-17 10:13:57 +08:00
关键词 sql 转义
ruanimal
2020-07-17 10:17:18 +08:00
```
sql = '...WHERE name=? and id=?'
curs.execute(cmd, (name, id))
```

https://bobby-tables.com/python.html
fucker
2020-07-17 12:51:20 +08:00
sql = f"select * from f65 where offer in ({','.join(list(map(str, offervalue)))})"
l4ever
2020-07-17 13:04:36 +08:00
六楼正解, sql 语句先整理好, 再用 python 去拼凑.这是两码事.
dingwen07
2020-07-17 13:08:43 +08:00
cursor.execute('''SELECT * FROM "table" where _rowid_=?''', (rowid,))
imn1
2020-07-17 13:24:14 +08:00
每个值是字串的话,最好上引号
val = ','.join([f'"{v}"' for v in offervalue])
sql = f'select * from f65 where offer in ({val})'
反正就是拼接字符串,你该去学学 string format 语法了,前置 f 就是 format 的缩略写法
如果搞不清引号,最外面套三引号就好了,f'''字串'''
youthfire
2020-07-17 17:33:10 +08:00
@imn1 非常感谢,代码完全符合需求,运行正常.我特意去看了下 f 的信息,能够想到的是
df = pd.DataFrame(pd.read_sql(f'select * from f65 where offer in {offervalue}', conn))

如果可能的话,求教一下,为什么需要遍历 offervalue 里每个元素重新连接,不能用现有的 list 吗? ({val})是转制为 turple 的意思么? 用我的写法跑的时候,pycharm 总是提示不存在 offervalue 这个 table.而我的意思只是想查这个 list,而不是 table

说的有点乱,当然,您的代码结果是完全正确的,我只是有点不知所以然.

同时感谢楼上所有关注的朋友,虽然代码我限于能力没有一一尝试.
imn1
2020-07-17 17:44:33 +08:00
@youthfire #10
{offervalue} 这样写是不对的,你能正常估计是 tuple,tuple 左右是圆括号,repr 刚好符合 sql 语法
如果是 list 左右方括号,repr 出来就是[val1, val2...],这个在 sql 就要报错了
levelworm
2020-07-18 11:04:01 +08:00
fstring 就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/690792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX