Python sqlite3 не может сделать представления просмотров таблиц - PullRequest
4 голосов
/ 05 декабря 2011

Через python я открываю базу данных SQLite и пытаюсь получить доступ к представлению таблицы.К сожалению, я получаю сообщение об ошибке.Приведенный ниже код Python демонстрирует проблему:

import sqlite3

conn = sqlite3.connect("test.db")
mydb = conn.cursor()

mydb.execute("CREATE TABLE TestTbl (MRTarget_id int, Fullmodel text)")
mydb.execute("CREATE TABLE TestTbl2 (Other_id int, Othermodel text)")

mydb.execute("CREATE VIEW TestView AS SELECT m.ROWID, m.MRTarget_id, m.Fullmodel, t.Othermodel FROM TestTbl m, TestTbl2 t")
mydb.execute("CREATE VIEW TestView2 AS SELECT m.Fullmodel, m.Othermodel FROM TestView m")

mydb.close()

Python выдает ошибку «sqlite3.OperationalError: нет такого столбца: m.Fullmodel» после попытки создания TestView2.Однако из подсказки Sqlite3 приведенные выше операторы SQL могут быть выполнены без каких-либо проблем.Поскольку моя база данных содержит представления представлений таблиц, мне интересно, возможно ли вообще получить программный доступ к ним через Python.

Ответы [ 2 ]

1 голос
/ 12 сентября 2012

У меня была такая же проблема - и я нашел решение.Я полагаю, что ваша проблема в том, что в вашем первоначальном представлении «TestView» имена атрибутов на самом деле m.ROWID, m.Fullmodel и т. Д., А не просто ROWID, Fullmodel и т. Д.

Случайный взгляд напри просмотре через менеджер sqlite не будет отображаться m., добавленный в начало каждого имени поля.Если вы выполните запрос Pragma PRAGMA table_info TestView, расширения атрибутов будут раскрыты.

Итак, измените запрос создания TestView на

CREATE VIEW TestView AS 
SELECT m.ROWID as ROWID, m.MRTarget_id as MRTarget_id,... etc

, и ваш второй запрос Create View должен успешно завершиться- по крайней мере, так было в моем заявлении.

0 голосов
/ 05 декабря 2011

Ваш код отлично работает для меня.

Вы можете попробовать сделать коммит между созданием первого представления и второго:

conn.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...