【问题标题】:Python/SQLite Command skipped with trigger使用触发器跳过 Python/SQLite 命令
【发布时间】:2014-01-14 00:43:52
【问题描述】:

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

我尝试通过 sqlite3 在 Python 2.7.4 中这样做:

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

但是在带有我的触发器的命令中,它返回:跳过命令:靠近“)”:语法错误。 在END之后;它返回:命令已跳过:无法提交 - 没有事务处于活动状态

【问题讨论】:

    标签: python triggers sqlite


    【解决方案1】:

    您在每个分号处拆分文件,但 CREATE TRIGGER 语句有一个嵌入的分号。

    要检查语句是否完整,请尝试sqlite3.complete_statement 函数。

    【讨论】:

    • 当然!我必须记住,每个问题都以分号开头 :P 现在使用 coplete_statement 效果很好。谢谢 CL :)
    【解决方案2】:

    SQLite 可以摄取和执行任意 SQL 语句。 为什么不考虑以下(未经测试):

    conn = sqlite3.connect('Company.db')

    c = conn.cursor()

    with open('MyScript.sql', 'r') as fd:

    try:
    
        c.execute(fd.read())
    
    except OperationalError, msg:
    
        print "Command skipped: ", msg
    

    【讨论】:

    • execute 只能执行一条 SQL 语句。
    • 应该说 executemany() 另见stackoverflow.com/questions/5331894/…
    • executemany 不能执行多条语句;它重复执行一条语句。
    • 由此可见投机的价值。
    猜你喜欢
    • 2016-07-14
    • 2019-10-09
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多