0

我正在尝试在 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
4

1 回答 1

0

解决了

将所有内容分解后,根本原因是构造的字符串。尝试将构造的字符串导出到 .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()

于 2021-07-21T11:36:26.897 回答