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 外面加双引号,变量就变成字符串了.
1
linuxkj 2020-07-17 10:05:39 +08:00
引用变量?如果还是 python 的语法,格式化不就行了吗,%s 或着 format 方法
'select * from f65 where offer in %s' %(offervalue) |
2
InkStone 2020-07-17 10:06:33 +08:00
你先别考虑 pd 啊 sqlite3 啊什么的东西……先学习一下 Python 的基本语法。
第一个语句传入的第一个参数是 False,根本不是一个字符串…… |
3
nightv2 2020-07-17 10:12:02 +08:00 via Android
我数了一下单引号,好像括号里面不能组成一个字符串吧?
|
4
crella 2020-07-17 10:13:57 +08:00
关键词 sql 转义
|
5
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 |
6
fucker 2020-07-17 12:51:20 +08:00
sql = f"select * from f65 where offer in ({','.join(list(map(str, offervalue)))})"
|
7
l4ever 2020-07-17 13:04:36 +08:00
六楼正解, sql 语句先整理好, 再用 python 去拼凑.这是两码事.
|
8
dingwen07 2020-07-17 13:08:43 +08:00 via iPhone
cursor.execute('''SELECT * FROM "table" where _rowid_=?''', (rowid,))
|
9
imn1 2020-07-17 13:24:14 +08:00 1
每个值是字串的话,最好上引号
val = ','.join([f'"{v}"' for v in offervalue]) sql = f'select * from f65 where offer in ({val})' 反正就是拼接字符串,你该去学学 string format 语法了,前置 f 就是 format 的缩略写法 如果搞不清引号,最外面套三引号就好了,f'''字串''' |
10
youthfire OP @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 说的有点乱,当然,您的代码结果是完全正确的,我只是有点不知所以然. 同时感谢楼上所有关注的朋友,虽然代码我限于能力没有一一尝试. |
11
imn1 2020-07-17 17:44:33 +08:00 1
@youthfire #10
{offervalue} 这样写是不对的,你能正常估计是 tuple,tuple 左右是圆括号,repr 刚好符合 sql 语法 如果是 list 左右方括号,repr 出来就是[val1, val2...],这个在 sql 就要报错了 |
12
levelworm 2020-07-18 11:04:01 +08:00
fstring 就可以了
|