SQL-запрос в Python дает OperationalError: near WITH: синтаксическая ошибка

Я пытался выполнить слияние CSV-файла с использованием SQL в Python со следующим SQL-запросом:

WITH
MATCHES AS( -- get all matches
    SELECT      CSV2.*
                , CSV1.ROW as ROW_1                 
                , CSV1.C4 as C4_1
                , CSV1.C5 as C5_1
    FROM        CSV2 
    LEFT JOIN   CSV1 
    ON          CSV1.C4 LIKE '%' || CSV2.C2 || '%'    
),
EXACT AS( -- matches where CSV1.C4 = CSV1.C5
    SELECT      *
    FROM        MATCHES
    WHERE       C4_1 = C5_1
),
MIN_ROW AS( -- CSV1.ROW of first occurence for each CSV2.C1
    SELECT      C1
                , min(ROW_1) as ROW_1
    FROM        MATCHES
    WHERE       C1 NOT IN (SELECT C1 FROM EXACT)
    GROUP BY    C1, C2, C3, C4, C5                  
)
-- use C4=C5 first
SELECT      *
FROM        EXACT
UNION
-- if match not in exact, use first occurence
SELECT      MATCHES.*
FROM        MIN_ROW
INNER JOIN  MATCHES
ON          MIN_ROW.C1 = MATCHES.C1
AND         (MIN_ROW.ROW_1 = MATCHES.ROW_1 OR MIN_ROW.ROW_1 IS NULL)
ORDER BY    C1

Однако я продолжаю получать OperationalError: рядом с "WITH": синтаксическая ошибка. Я не очень хорошо знаком с SQL и раньше не пытался использовать его в Python. Что можно сделать, чтобы исправить эту ошибку? Update1 - запрос в первой паре скобок отлично работает без части "с совпадением как". Вот примеры файлов csv: CSV1

data13      data23      d      main_data1;main_data2      data13         data23
data12      data22      d      main_data1;main_data2      data12         data22
data11      data21      d      main_data1;main_data2      data11         data21
data3       data4       d      main_data2;main_data4      data3          data4
data52      data62      d      main_data3                 data51         data62
data51      data61      d      main_data3                 main_data3     data61
data7       data8       d      main_data4                 data7          data8

CSV2

id1      main_data1      a1      a2      a3
id2      main_data2      b1      b2      b3
id3      main_data3      c1      c2      c3
id4      main_data4      d1      d2      d3
id5      main_data5      e1      e2      e3

и код Python

import csv
import sqlite3

def createTable(cursor, rows, tablename):
    tableCreated = False
    for row in rows:
        if not tableCreated:
            sql = "CREATE TABLE %s(ROW INTEGER PRIMARY KEY, " + ", ".join(["c%d" % (i+1) for i in range(len(row))]) + ")"
            cur.execute(sql % tablename)
            tableCreated = True
        sql = "INSERT INTO %s VALUES(NULL, " + ", ".join(["'" + c + "'" for c in row]) + ")"
        cur.execute(sql % tablename)
    conn.commit()


conn = sqlite3.connect(":memory:")
cur = conn.cursor()

for filename, tablename in [(path_to_csv1, "CSV1"), (path_to_csv2, "CSV2")]:
    with open(filename, "r") as f:
        reader = csv.reader(f, delimiter=',')        
        rows = [row for row in reader]
    createTable(cur, rows, tablename)

Update2 - я использую Python 2.7


person abn    schedule 04.12.2014    source источник


Ответы (2)


Предложение WITH поддерживается начиная с SQLite 3.8.3. Версия, поставляемая с Python 2.7, намного старше.

Обновите Python до последней версии или используйте другой драйвер базы данных, например apsw, или, если Python скомпилирован с динамическими библиотеками, попробуйте заменить файл библиотеки SQLite.

person CL.    schedule 04.12.2014
comment
+1: замена sqlite на 3.21.0 решила эту проблему. -1: sqlite не является частью Python. См. stackoverflow.com/a/1553190/2166224. - person kidmose; 12.01.2018

Добавлять ';' перед With как

;WITH
MATCHES AS( ...
person Deepshikha    schedule 04.12.2014
comment
Спасибо за ответ. Но ошибка все равно возникает. - person abn; 04.12.2014
comment
Это mysql / T-sql или что? - person Deepshikha; 04.12.2014