Python 获得;sqlite3.ERROR:没有这样的列:";
我是python新手(我相信您可以从我的代码中看出这一点),并且基本上编写了一个示例脚本来测试一些核心命令,以便更好地理解事情的工作原理。除了最后一个“插入”命令外,我已经按照设计运行了所有的东西——经过数小时的谷歌搜索和实验,我无法找出哪里出了问题,所以如果有人能告诉我需要更改什么并帮助我理解原因,我将不胜感激(我确信这是基本的,但我很困惑!) 下面是给我带来麻烦的一行:Python 获得;sqlite3.ERROR:没有这样的列:";,python,variables,sqlite,insert,operationalerror,Python,Variables,Sqlite,Insert,Operationalerror,我是python新手(我相信您可以从我的代码中看出这一点),并且基本上编写了一个示例脚本来测试一些核心命令,以便更好地理解事情的工作原理。除了最后一个“插入”命令外,我已经按照设计运行了所有的东西——经过数小时的谷歌搜索和实验,我无法找出哪里出了问题,所以如果有人能告诉我需要更改什么并帮助我理解原因,我将不胜感激(我确信这是基本的,但我很困惑!) 下面是给我带来麻烦的一行: c.execute("INSERT OR IGNORE INTO {tn} ({cn1}, {cn2}, {cn3}, {
c.execute("INSERT OR IGNORE INTO {tn} ({cn1}, {cn2}, {cn3}, {cn4}) VALUES ({VID}, {VSnu}, {VIN}, {VName})".\
format(tn=table_name, cn1=column1, cn2=column2, cn3=column3, cn4=column4, VID=ID, VSnu=Snu, VIN=IN, VName=Name))
以下是上下文的完整脚本,如果有帮助的话:
import sqlite3
sqlite_file = '/test_database.sqlite' # name of the sqlite database file
table_name = 'test_table'
column1 = 'my_1st_column'
column2 = 'my_2nd_column'
column3 = 'my_3rd_column'
column4 = 'my_4th_column'
ID = int(123456)
Base = 'Arnold'
Snu = 'test'
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
c.execute("UPDATE {tn} SET {cn2}=('Snu'), {cn3}=('Muh'), {cn4}=('Arnold_A') WHERE {cn1}=({NID})".\
format(tn=table_name, cn1=column1, cn2=column2, cn3=column3, cn4=column4, NID=ID))
i = 1
while(i<15):
if i == 1: IN = 'B'
if i == 2: IN = 'C'
if i == 3: IN = 'D'
if i == 4: IN = 'E'
if i == 5: IN = 'F'
if i == 6: IN = 'G'
if i == 7: IN = 'H'
if i == 8: IN = 'I'
if i == 9: IN = 'J'
ID = ID+1
i = i+1
Name = Base + '_' + IN
params = (Snu, IN, Name)
c.execute("INSERT OR IGNORE INTO {tn} ({cn1}, {cn2}, {cn3}, {cn4}) VALUES ({VID}, {VSnu}, {VIN}, {VName})".\
format(tn=table_name, cn1=column1, cn2=column2, cn3=column3, cn4=column4, VID=ID, VSnu=Snu, VIN=IN, VName=Name))
if(i == 10): break
conn.commit()
conn.close()
导入sqlite3
sqlite_file='/test_database.sqlite'#sqlite数据库文件的名称
表名称='测试表'
column1='我的第一列'
column2='我的第二列'
column3='我的第三列'
column4='我的第四列'
ID=int(123456)
Base='Arnold'
Snu=‘测试’
conn=sqlite3.connect(sqlite\u文件)
c=连接光标()
c、 执行(“更新{tn}集{cn2}=('Snu'),{cn3}=('Muh'),{cn4}=('Arnold_A'),其中{cn1}=({NID})”\
格式(tn=table_name,cn1=column1,cn2=column2,cn3=column3,cn4=column4,NID=ID))
i=1
虽然(我知道你只是在学习,所以不要被我接下来要说的话吓坏了:-) 您的SQL命令格式不正确。在许多数据库API中,包括Python中的SQLite,都有一个称为参数替换的特殊特性 您不希望像现在这样连接值,因为它为SQL注入打开了空间。在像您这样的简单场景中,这可能不是问题,但当人们在互联网上公开的服务中这样做时,可能会造成巨大的损害(数据盗窃、数据丢失、数据损坏等)。这本漫画说明了这个问题: 在您的情况下,编写带有参数替换的SQL命令不仅可以使代码更安全、更易于阅读,还可以解决您看到的问题 请参见下面的示例:
import sqlite3
conn = sqlite3.connect(":memory:")
c = conn.cursor()
# Here we don't need parameter substitution
c.execute("CREATE TABLE mytable (name text, quantity int)")
# We set the values somewhere else. For example, this could come from a web
# form
entry = ("myname", 2)
# Now we execute the query, with the proper parameter substitution.
# Note the `?` characters. Python will automatically replace those with the
# values in `entry`, making sure that things are right when forming the
# command before passing to SQLite.
c.execute("INSERT OR IGNORE INTO mytable VALUES (?, ?)", entry)
print(c.execute("SELECT * from mytable").fetchall())
上面的示例假设您不需要参数化列名。在您的例子中,您显然正在读取所有列,因此您实际上不需要传递所有名称,只需像我在上面的示例中所做的那样,它将读取所有列。如果确实需要列名作为参数来读取数据子集,那么您必须求助于类似于您所使用的连接机制。但在这种情况下,和往常一样,对用户输入要非常小心,以确保它不会形成错误的查询和命令
此处有更多详细信息:请尝试使用单引号括起SQL中的字符串文字。您应该真正考虑使用参数作为查询值。