Загрузка таблицы в sqlite db с использованием python: таблица не найдена - PullRequest
0 голосов
/ 15 октября 2011

Я использую Python 2.7 и пытаюсь загрузить файл с разделителем канала в таблицу sqlite.

Первоначально я пытался блокировать транзакции, но натолкнулся на «Операционная ошибка: такой таблицы нет: ff.Я добавил глобальный оператор в функцию, тоже не помог (не ожидал, но попытался быть уверенным).

Поэтому, удалив вызов функции в целях отладки, я добавил INSERTоператор непосредственно в цикле, и получить ту же ошибку.

Я проверил: clt.db создан и содержит таблицу ff (пусто tho). Ошибка происходит в строке 64 (curs.execute (insertStmt,obs), так как белье было отредактировано).

Я не знаю, имеет ли это какое-либо отношение к решению или нет (надеюсь, нет): я запускаю это на экземпляре micro EC2 с цельюБД записывается в корзину S3, смонтированную через s3fs. Может быть, проблема с задержкой?

- обновление: я получил это, чтобы работать при закрытии как соединения и курсора, так и их открытии. Даже после conn.commit ().Пробовал time.sleep () и that не помогло, поэтому кажется, что соединение / курсор действительно должны быть закрыты и вновь открыты для регистрации присутствия новой таблицы.Почему это я понятия не имею.Любой совет?

Есть идеи?Спасибо.

Aust.

import csv,sqlite3

dbName = 'clt.db'
conn = sqlite3.connect(dbName)
curs = conn.cursor()


def loadBloc(bloc):
        global conn,curs
        curs.execute('begin')
        for obs in bloc:
                curs.execute(insertStmt,obs)
        conn.commit()
        return None



createCode = '''
create table ff
(
a text not null,
b text not null,
c text not null,
d numeric not null,
e text not null,
f text not null,
g text not null,
h numeric not null,
i numeric not null
);
'''

curs.execute(createCode)
conn.commit()

nb = 10000; cnt = 0
bloc = ["" for i in range(nb)]
f = open(infile,'rt')
csv.register_dialect('pipes',delimiter='\t')
with open('ff.dat','r') as f:
        reader = csv.reader(f,dialect='pipes')
        for row in reader:
                a    = row[0]
                b    = row[1]
                c    = row[2]
                u = c.split('/')
                if len(u) == 3:
                        v = [int(u[i]) for i in range(len(u)) ]
                        c = "{0:4d}-{1:02d}-{2:02d}".format(v[2],v[1],v[0])
                else:
                        c = "1212-12-12"
                d   = row[3]
                e   = row[4]
                f   = row[5]
                g   = row[6]
                h   = row[7]
                i   = row[8]

                obs = (a,b,c,d,e,f,g,h,i)
                insertStmt = 'insert into ff (a,b,c,d,e,f,g,h,i) values (' + ','.join('?'*9) + ');'
                curs.execute(insertStmt,obs)
                conn.commit()

                print cnt
                #bloc[cnt] = (a,b,c,d,e,f,g,h,i)
                #if cnt == nb-1:
                #       loadBloc(bloc)
                #       print "=============================================="
                #       bloc = ["" for i in range(nb)]
                #       cnt = 0
                #else:
                #       cnt = cnt + 1

f.close()
curs.close()
conn.close()

1 Ответ

0 голосов
/ 16 октября 2011

Нет ничего плохого в вашем коде.После обрезки всего неиспользуемого кода, если сделать оставшийся код более кратким и заставить cnt считать что-то, он работает нормально, как показано ниже, только с одним коммитом (непосредственно перед завершением).Я предлагаю вам сначала попробовать этот код в не облачной системе, чтобы убедиться, что нет проблем с Python, sqlite или csv.Затем попробуйте на подозрительном экземпляре и других, если это необходимо.

[ff.py]

import csv,sqlite3

dbName = 'clt.db'
conn = sqlite3.connect(dbName)
curs = conn.cursor()
createCode = '''
    create table ff
    (
        a text not null,
        b text not null,
        c text not null,
        d numeric not null,
        e text not null,
        f text not null,
        g text not null,
        h numeric not null,
        i numeric not null
    );
'''

insertStmt = (
    'insert into ff (a,b,c,d,e,f,g,h,i) values (' +
    ','.join('?'*9) +
    ');'
    )

curs.execute(createCode)
# conn.commit() # works ok without this

with open('ff.dat','r') as f:
    reader = csv.reader(f,delimiter='|')
    for cnt, row in enumerate(reader, 1):
        a,b,c,d,e,f,g,h,i = row
        u = c.split('/')
        if len(u) == 3:
            v = [int(x) for x in u]
            c = "{0:4d}-{1:02d}-{2:02d}".format(v[2],v[1],v[0])
        else:
            c = "1212-12-12"
        obs = (a,b,c,d,e,f,g,h,i)
        curs.execute(insertStmt,obs)
        # conn.commit() # doesn't need to be inside the loop
        print "row number:", cnt

curs.close()
conn.commit() # need at least 1 commit
conn.close()

[стенограмма]

C:\junk\so>del clt.db

C:\junk\so>type ff.dat
A|B|C|D|E|F|G|H|I
1|2|16/10/2011|4|5|6|7|8|9

C:\junk\so>\python27\python ff.py
row number: 1
row number: 2

C:\junk\so>\bin\sqlite3 clt.db
SQLite version 3.6.14
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from ff;
A|B|1212-12-12|D|E|F|G|H|I
1|2|2011-10-16|4|5|6|7|8|9
sqlite> ^Z

C:\junk\so>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...