Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用触发器跳过Python/SQLite命令_Python_Triggers_Sqlite - Fatal编程技术网

使用触发器跳过Python/SQLite命令

使用触发器跳过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

我的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      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: