问题描述
我正在尝试使用 python 3 中构造的 f 字符串创建 sqlite3 db 表,但是我收到以下错误:
sqlite3.OperationalError: near "(": Syntax error
我曾希望我不需要在这里询问语法错误,但我一直在 stackoverflow 以及一般在线搜索以识别问题,但没有成功。 我已经将代码与其他示例进行了比较,同样没有看到构造有任何不同,除了使用 f 字符串似乎并不常见。
我已经阅读了传递参数的利弊,我更喜欢这个 f 字符串,除非它是根本原因。
我希望这个问题可能很明显,但是任何指针都将不胜感激。
完整代码如下:
import sqlite3
import pandas as pd
db_path = [PATH TO DATABASE]
db_table_name = [TABLE NAME]
header_source = [PATH TO .XLSX]
def ReadHeaders():
df = pd.read_excel(header_source)
col_list = list(df.columns.values)
prep_col_list = [item.replace(" ","_") for item in col_list]
col_string = " TEXT,_".join(prep_col_list)
final_col_string = col_string.replace("Primary_ID TEXT","Primary_ID PRIMARY KEY")
return final_col_string
def Createsqldb():
cols = ReadHeaders()
conn = sqlite3.connect(db_path)
c = conn.cursor()
c.execute(f""" CREATE TABLE IF NOT EXISTS {db_table_name} ({cols}) """)
conn.commit()
conn.close()
为表头创建的字符串示例是:
_link TEXT,_Primary_ID PRIMARY KEY,_Status_Description TEXT,_Price_List_Status TEXT,_Brand TEXT,_36_Character_Description TEXT
解决方法
已解决
在分解所有内容后,根本原因是构造的字符串。当我尝试将构造的字符串导出到 .txt 文件并收到 unicode 错误时,我能够识别它。
之前的代码:
return final_col_string
之后的代码:
return final_col_string.encode(encoding="utf-8")
我还添加了一个简单的表格信息检查以进行确认
def ShowTable(c):
c.execute(f"PRAGMA table_info({db_table_name})")
print (c.fetchall())
完整的代码包含其他人遇到此问题:
import sqlite3
import pandas as pd
db_path = [PATH TO DATABASE]
db_table_name = [TABLE NAME]
header_source = [PATH TO .XLSX]
def ReadHeaders():
df = pd.read_excel(header_source)
col_list = list(df.columns.values)
prep_col_list = [item.replace(" ","_") for item in col_list]
col_string = " TEXT,_".join(prep_col_list)
final_col_string = col_string.replace("Primary_ID TEXT","Primary_ID PRIMARY KEY")
return final_col_string.encode(encoding="utf-8")
def CreateSQLdb():
cols = ReadHeaders()
conn = sqlite3.connect(db_path)
c = conn.cursor()
c.execute(f""" CREATE TABLE IF NOT EXISTS {db_table_name} ({cols}) """)
conn.commit()
conn.close()
def ShowTable(c):
c.execute(f"PRAGMA table_info({db_table_name})")
print (c.fetchall())
if __name__ == "__main__":
CreateSQLdb()