【问题标题】:Pass variable value to column name sqlite3 python将变量值传递给列名 sqlite3 python
【发布时间】:2021-02-22 01:27:35
【问题描述】:

我正在尝试通过添加列来更改表,但我不想直接在 sql 语句中命名它,而是想使用变量值,因此我可以继续添加列并进一步循环。其他变量有多种类型,从整数、浮点数、字符串甚至日期。

import sqlite3
db_path = "/Users/mbp2013/Library/Mobile Documents/com~apple~CloudDocs/Documents/Code/xml_echo_script/echo_db.db"

conn = sqlite3.connect(db_path)
db = conn.cursor()

variable = "whatever"
db.execute("ALTER TABLE echo ADD COLUMN ?", (variable))

但是,我不断收到 sqlite3.OperationalError: near "?": syntax error

我正在使用 sqlite 3 和 python 3.8.3。

有什么想法吗?

【问题讨论】:

    标签: python python-3.x sqlite


    【解决方案1】:

    您可能想使用基于 Python 的字符串替换:

    import sqlite3
    
    db_path = "/Users/mbp2013/Library/Mobile Documents/com~apple~CloudDocs/Documents/Code/xml_echo_script/echo_db.db"
    conn = sqlite3.connect(db_path)
    db = conn.cursor()
    variable = "whatever"
    db.execute(f"ALTER TABLE echo ADD COLUMN {variable}")
    

    【讨论】:

    • 谢谢,成功了!但是如果变量类型不是字符串,而是整数,甚至是日期的浮点数呢?
    • 这也有效。它将转换为文本。详情请见docs.python.org/3.8/reference/…
    • 这不一定有效,因为它们不是有效的列名。您尝试做的是正确的逻辑,它不适用于列名或表名。 不要使用 f 字符串在查询中插入数据 - 参数化是正确的方法
    • 确实,当我使用字符串变量尝试它时,它可以工作,但不适用于其他未声明的变量类型。另外,当我尝试运行循环以添加以列表命名的新列时,其中第一个值为 2D/Ao,它给了我一个新错误:sqlite3.OperationalError: unrecognized token: "2D"
    【解决方案2】:

    试试这个:

    import sqlite3
    
    db_path = '/Users/mbp2013/Library/Mobile Documents/com~apple~CloudDocs/Documents/Code/xml_echo_script/echo_db.db'
    conn = sqlite3.connect(db_path)
    db = conn.cursor()
    
    variable = 'whatever varchar'
    db.execute('''ALTER TABLE echo ADD COLUMN ''' + variable)
    

    列名必须遵循以下准则:

    1. 不能是关键字 (https://www.sqlite.org/lang_keywords.html)
    2. 必须以字母字符或下划线开头,后跟字母数字字符或下划线。

    【讨论】:

    • 谢谢。这适用于字符串,但由于某种原因,如果数字是变量的一部分,它总是会失败,即使我将它声明为字符串,无论是用逗号还是 variable = str(variable)
    • 在这里给我你的变量样本。
    • 例如 2D 或 2D/Ao。
    • 不能以数字开头。不能包含斜线。
    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多