python - SQL 字符串在 SQLIte 列名中抛出带有特殊字符的错误
问题描述
我有一个 SQLite 数据库。在所述表中存在一列,其中包含“-”/减号。这个 SQLite 数据库是使用 pandas(SQLAlchemy 作为引擎)从 python 3.6 创建的。该表和该列的创建没有问题。但是,当我想在此表上构建查询时,我不知道如何转义“-”字符。这是一个简短的例子:
#imports
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
#create df
df = pd.DataFrame(np.random.rand(10,2),columns=['Column1','Prob-Column'])
# create engine to connect to db
engine = create_engine('sqlite://')
#create table in db
df.to_sql('my_table',engine,if_exists='replace')
# variables
vals = '(?)'
fil = ('key',)
# create sql string
sq = 'SELECT * FROM {t} WHERE {c1} IN {vals} GROUP BY {c2}'\
.format(t='my_table',c1='Column1',c2='Prob-Column',vals = vals)
#write query to pandas df
df = pd.read_sql_query(sq,engine,params=(fil))
跟踪如下:
OperationalError: (sqlite3.OperationalError) no such column: Prob [SQL: 'SELECT * FROM my_table WHERE Column1 IN (?) GROUP BY Prob-Column'] [parameters: ('key',)] (Background on this error at: http://sqlalche.me/e/e3q8)
解决方案
这是解决方案。列名只需要用双引号括起来,即在单引号的内侧,这样 c2='"Prob-Column"'。无论如何,希望这对其他人有帮助。
#imports
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
#create df
df = pd.DataFrame(np.random.rand(10,2),columns=['Column1','Prob-Column'])
# create engine to connect to db
engine = create_engine('sqlite://')
#create table in db
df.to_sql('my_table',engine,if_exists='replace')
# variables
vals = '(?)'
fil = ('key',)
# create sql string
sq = 'SELECT * FROM {t} WHERE {c1} IN {vals} GROUP BY {c2}'\
.format(t='my_table',c1='Column1',c2='"Prob-Column"',vals = vals)
#write query to pandas df
df = pd.read_sql_query(sq,engine,params=(fil))
推荐阅读
- google-analytics - BigQuery 中处理日内 GA 数据的最佳方式
- amazon-web-services - AWS 访问 Spring Cloud eureka 服务器的问题
- arrays - 在具有所有唯一值的数组中搜索最短切片,如何以最佳方式执行此操作?
- riscv - RISCV 指令
- python - 将 TensorFlow Graph 转换为使用 Estimator,使用 `sampled_softmax_loss` 或 `nce_loss` 在损失函数中获取“TypeError:数据类型不理解”
- python-3.x - 如何在 Python 中递归比较两个字符串?
- sql - 在 SQL 查询中重写多个 NOT EXISTS 子句的可能方法?
- azure - Azure CDN 会话问题后端应用程序网关
- javascript - Mongo collection.find().then() 不是函数
- amazon-cloudformation - fargate 在私有子网中的 docker pull 上失败