TypeError: execute () принимает ровно 2 аргумента (задано 3) - метод execute sqlite3 Jython - PullRequest
0 голосов
/ 08 апреля 2019

В настоящее время я работаю над скриптом Python, запускаемым через Jython 2.7, и я использую модуль sqlite3 для Jython ( link ), синтаксис которого идентичен модулю CPython sqlite3.

Здесьэто код:

    def file_exists(self, cur, file_hash):
        cur.execute("SELECT 1 FROM samples WHERE file_hash = ?", (file_hash,))
        ret = cur.fetchone()
        if ret is None:
            return False
        return True
cur.execute("SELECT 1 FROM samples WHERE file_hash = ?", (file_hash,))
TypeError: execute() takes exactly 2 arguments (3 given)

Я посмотрел в Интернете, и синтаксис, кажется, правильный, поэтому я не понимаю, что является причиной этой проблемы.

РЕДАКТИРОВАТЬ:

import os
import sys
import time
import json
import logging
import sqlite3
from hashlib import sha1

ANALYSIS_FAILED = 0
ANALYSIS_SUCCESS = 1
ANALYSIS_ALREADY = 2

class ProgramAnalyzer:

    def __init__(self):
        self.filename = None
        self.cyclomatic_complexities = None
        self.primes = None
        self.signature = None
        self.file_hash = None
        self.total_functions = 0
        self.analysis_date = None
        self.architecture = None

    def file_exists(self, cur, file_hash):
        cur.execute("SELECT 1 FROM samples WHERE file_hash = ?", (file_hash,))
        ret = cur.fetchone()
        if ret is None:
            return False
        return True

    def analyze(self):
        t = time.time()

        executable_path = getCurrentProgram().getExecutablePath()
        content = open(executable_path, 'r').read()
        self.file_hash = sha1(content).hexdigest()

        # Checking whether such file is already in the database
        conn = cur = None
        try:
            conn = sqlite3.connect('db.sqlite')
            cur = conn.cursor()
        except sqlite3.Error as e:
            logging.error("Database error: " + str(e))
            return ANALYSIS_FAILED

        if self.file_exists(cur, self.file_hash):
            return ANALYSIS_ALREADY
        print("File not in database")

        [initializing remaining object fields]

        return ANALYSIS_SUCCESS

def main():
    analyzer = ProgramAnalyzer()
    ret = analyzer.analyze()
    if ret == ANALYSIS_FAILED:
        sys.exit(1)

if __name__ == "__main__":
    main()

Такие функции, как getCurrentProgram () и getExecutablePath () - это некоторые Java API, которые я использую.

1 Ответ

0 голосов
/ 08 апреля 2019

Это похоже на проблему с jython-sqlite3. Он имеет другую подпись для Cursor.execute(): https://github.com/anthonyhendrickson/jython-sqlite3/blob/master/sqlite3/module.py#L27

То есть отличается от сигнатуры той же функции в стандартной библиотеке Python, которая поддерживает параметры SQL: https://docs.python.org/2/library/sqlite3.html#sqlite3.Cursor.execute

...