使用触发器跳过Python/SQLite命令
我的SQLite数据库有一些问题。我有一些sql脚本,如下所示:使用触发器跳过Python/SQLite命令,python,triggers,sqlite,Python,Triggers,Sqlite,我的SQLite数据库有一些问题。我有一些sql脚本,如下所示: CREATE TABLE Workers( Id_worker INT NOT NULL PRIMARY KEY, Name VARCHAR(20) NOT NULL, Surname VARCHAR(30) NOT NULL, Id_job INT NOT NULL, -- REFERENCES Job(Id_job), Adress VARC
CREATE TABLE Workers(
Id_worker INT NOT NULL PRIMARY KEY,
Name VARCHAR(20) NOT NULL,
Surname VARCHAR(30) NOT NULL,
Id_job INT NOT NULL, -- REFERENCES Job(Id_job),
Adress VARCHAR(30) NOT NULL,
Start_date SMALLDATETIME NOT NULL
);
CREATE TABLE OldWorkers(
Id_arch INT NOT NULL PRIMARY KEY,
Name VARCHAR(20) NOT NULL,
Surname VARCHAR(30) NOT NULL,
Id_job INT NOT NULL, -- REFERENCES Job(Id_job),
Adress VARCHAR(30) NOT NULL,
Start_date SMALLDATETIME NOT NULL,
Delete_date SMALLDATETIME NOT NULL
);
CREATE TRIGGER OldWorkersTrigger
AFTER DELETE ON Workers
FOR EACH ROW
BEGIN
INSERT INTO OldWorkers (Id_arch, Name, Surname, Id_job, Adress, Start_date) VALUES (old.Id_arch, old.Name, old.Surname, old.Id_job, old.Adress, old.Start_date,datatime('now'));
END;
conn = sqlite3.connect('Company.db')
c = conn.cursor()
fd = open('MyScript.sql', 'r')
sqlFile = fd.read()
fd.close()
# all SQL commands (split on ';')
sqlCommands = sqlFile.split(';')
i = 1
# Execute every command from the input file
for command in sqlCommands:
# This will skip and report errors
# For example, if the tables do not yet exist, this will skip over
# the DROP TABLE commands
print i," : ",command
i = i + 1
try:
c.execute(command)
except OperationalError, msg:
print "Command skipped: ", msg
我尝试通过sqlite3在Python 2.7.4中这样做:
CREATE TABLE Workers(
Id_worker INT NOT NULL PRIMARY KEY,
Name VARCHAR(20) NOT NULL,
Surname VARCHAR(30) NOT NULL,
Id_job INT NOT NULL, -- REFERENCES Job(Id_job),
Adress VARCHAR(30) NOT NULL,
Start_date SMALLDATETIME NOT NULL
);
CREATE TABLE OldWorkers(
Id_arch INT NOT NULL PRIMARY KEY,
Name VARCHAR(20) NOT NULL,
Surname VARCHAR(30) NOT NULL,
Id_job INT NOT NULL, -- REFERENCES Job(Id_job),
Adress VARCHAR(30) NOT NULL,
Start_date SMALLDATETIME NOT NULL,
Delete_date SMALLDATETIME NOT NULL
);
CREATE TRIGGER OldWorkersTrigger
AFTER DELETE ON Workers
FOR EACH ROW
BEGIN
INSERT INTO OldWorkers (Id_arch, Name, Surname, Id_job, Adress, Start_date) VALUES (old.Id_arch, old.Name, old.Surname, old.Id_job, old.Adress, old.Start_date,datatime('now'));
END;
conn = sqlite3.connect('Company.db')
c = conn.cursor()
fd = open('MyScript.sql', 'r')
sqlFile = fd.read()
fd.close()
# all SQL commands (split on ';')
sqlCommands = sqlFile.split(';')
i = 1
# Execute every command from the input file
for command in sqlCommands:
# This will skip and report errors
# For example, if the tables do not yet exist, this will skip over
# the DROP TABLE commands
print i," : ",command
i = i + 1
try:
c.execute(command)
except OperationalError, msg:
print "Command skipped: ", msg
但在带有trigget的命令中,它返回:command skipped:near:syntax error。
结束后;它返回:Command skipped:cannot commit-没有活动的事务SQLite可以接收和执行任意SQL语句。 为什么不考虑以下未经测试的: conn=sqlite3.connect'Company.db' c=连接光标 使用打开的'MyScript.sql','r'作为fd:
try:
c.execute(fd.read())
except OperationalError, msg:
print "Command skipped: ", msg
您将在每个分号处拆分文件,但CREATE TRIGGER语句中嵌入了一个分号
要检查语句是否完整,请尝试sqlite3.complete_语句函数。execute只能执行一条SQL语句。应该说executemany请参见executemany不能执行多条语句;它重复执行一条语句。因此我们看到了投机的价值。当然!我必须记住,每个问题都是以分号开始的:P现在用coplete\u语句,效果很好。谢谢CL: