Мое заявление вставки выполняется дважды, и я не уверен почему. sqlite3 - PullRequest
1 голос
/ 09 мая 2019

У меня есть оператор вставки.

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


   with conn:
           cur1 = conn.cursor()
           cur1.execute("insert into workorder (Title, Link, Status) 
    values (?,?,?)", ('iijiji', 'ijjijijj', '22jhhuhij'))

   if conn:
           conn.close()

Столбцы заголовка и ссылки имели уникальные ограничения, и я получил следующую ошибку, и моя программа остановилась.

sqlite3.IntegrityError: UNIQUE constraint failed: 

Но 1 новая запись вставлена ​​в базу данных, что я и хотел.

Затем я создал новую таблицу, в которой столбцы «Заголовок» и «Ссылка» не имели ограничения UNIQUE.

Я снова запустил программу и на этот раз не получил ошибки, однако запись была вставлена ​​втаблица дважды, которая объясняет ошибку при наличии уникальных ограничений на ссылку и заголовок.

Есть ли логическое объяснение, почему этот оператор вставки выполняется дважды?

Примечание. Это единственное место в программе, где устанавливается соединение, выполняется запрос, а затем соединение закрывается.В программе нет другого взаимодействия с этой базой данных, кроме обычной конфигурации.

У меня не было других открытых сессий с этой базой данных, кроме как внутри этого приложения.

Я выполняю этот запрос в файле python, из которого запускается программа.

   app = Flask(__name__)

   app.config.from_object(Config)

   db = SQLAlchemy(app)

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


   with conn:
          cur1 = conn.cursor()
         cur1.execute("insert into workorder (Title, Link, Status) values 
  (?,?,?)", ('en24433', 'www.reddit.com', 'Not Completed'))

 if conn:
         conn.close()


 migrate = Migrate(app, db)


 @app.route('/')
 def index():
     return render_template('index.html')

 if __name__ == '__main__':
     app.run(host='localhost', port=8080, debug= True)

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Это сработало, когда я установил соединение с базой данных и вставил операторы в индексный маршрут, а не выше маршрутов.

 app = Flask(__name__)

app.config.from_object(Config)

db = SQLAlchemy(app)

migrate = Migrate(app, db)


@app.route('/')
 def index():
     conn = sqlite3.connect('WO1.db')

     with conn:
         cur1 = conn.cursor()
         cur1.execute("insert into work_order (Title, Link, Status) values (?,?,?)",
                     ('iikii', 'ijkoijj', '66hhuhij'))
       conn.close()

       return render_template('index.html')
0 голосов
/ 09 мая 2019

Вам необходимо переделать код доступа к базе данных.

Во-первых, вы дважды подключаетесь к одному и тому же дб, используя оператор with после conn.connect().

Когда к базе данных получают доступ несколько соединений, и один из процессов изменяет базу данных, база данных SQLite блокируется до тех пор, пока эта транзакция не будет зафиксирована.

Я думаю, что это причина вашей ошибки .

После внесения в базу данных вам необходимо зафиксировать изменения.

Этот метод фиксирует текущую транзакцию. Если вы не вызываете этот метод, все, что вы сделали со времени последнего вызова commit (), не будет видно из других соединений с базой данных. Если вам интересно, почему вы не видите данные, которые вы записали в базу данных, убедитесь, что вы не забыли вызвать этот метод.

Имейте в виду, что close () не выполняет автоматическую фиксацию:

Это закрывает соединение с базой данных. Обратите внимание, что это не вызывает автоматически commit (). Если вы просто закроете соединение с базой данных без предварительного вызова commit (), ваши изменения будут потеряны!

Взгляните на документы по sqlite3 API

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