如何在Python中执行SQLite脚本?

11

当我在SQLite shell中输入以下命令时,我的SQLite脚本可以正常工作:

.read 'dummy.sql'

然而,下面的Python代码并未正确执行。我在第5行遇到了语法错误。

import sqlite3
db = sqlite3.connect('scheduling.db')
cursor=db.cursor()
a='''.read "scheduling.sql"'''
cursor.execute(a)
db.commit
db.close()

我知道我在引号方面做错了什么。如何使这个有效?


1
“.read”是由sqlite3 shell程序实现的命令,而不是sqlite3库。你无法执行它。 - Shawn
请将QUERY语句放入您的a变量中,如下所示:a="SELECT * FROM desired-table ORDER BY id DESC LIMIT 1" - Benyamin Jafari
3个回答

16

我建议的解决方法是将.sql文件的内容读入Python字符串变量,就像读取其他文本文件一样,然后调用executescript。与execute不同,executescript可以在一次调用中执行多个语句。例如,如果你的.sql文件包含以下内容,则它将正确地工作:

CREATE TABLE contacts (
 contact_id INTEGER PRIMARY KEY,
 first_name TEXT NOT NULL,
 last_name TEXT NOT NULL
);

INSERT INTO contacts (contact_id, first_name, last_name)
VALUES (1, 'John', 'Smith');

以下是您需要的完整 Python 代码片段:

import sqlite3

with open('scheduling.sql', 'r') as sql_file:
    sql_script = sql_file.read()

db = sqlite3.connect('scheduling.db')
cursor = db.cursor()
cursor.executescript(sql_script)
db.commit()
db.close()

谢谢,这正是我所需要的。此外,我正要问如何将参数传递给我的脚本。但是通过这种方法,很容易看到我可以在脚本被读取后简单地将它们插入到我的字符串中。 - vegebond

0

不行。程序sqlite3可以看作是分为两部分:

  • 外部,它将输入的行解析为SQL命令
  • 内部,它将这些SQL命令传递给引擎
  • 再次外部,它显示SQL命令的结果。

.read是一种命令:解析器打开文件并从中读取行。据我所知,sqlite3库中没有任何东西可以模拟该解析器部分,因此您需要手动将行解析为SQL语句,然后逐个执行SQL语句。


0
试试这个。您可以使用“打开”函数从文件中读取查询 - 这将替换掉

.read

功能; SQL脚本是包含查询的文本文件。然后运行read_sql_query。
import sqlite3
import pandas as pd
sqlite_file = 'scheduling.db'
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
f = open('scheduling.sql','r')
sql = f.read() 
print pd.read_sql_query(sql, conn)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接