2015-01-28 2 views
1

Я могу успешно создать таблицу в базе данных sqlite3 с помощью Python, но я не могу вставить в него данныене может вставить данные в sqlite3 с помощью Python

# coding: utf-8 

import sqlite3 

text = "Welcome" 

def cur_execute(data): 
    con = sqlite3.connect('sqlite3.db') 
    try: 
     with con: 
      cur = con.cursor() 
      cur.execute(data) 
      con.commit() 
    except Exception as why: 
     print(why) 
    finally: 
     if con: con.close() 

cur_execute("CREATE TABLE Hello(test TEXT)") 
cur_execute("INSERT INTO Hello VALUES(?)", (text)) 

показать мне эту ошибку: cur_execute() занимает ровно 1 аргумент (2 данный)

thx.

+2

если вы используете 'с' для связи. Вам не нужно звонить близко. –

ответ

0

Функция принимать один параметр: SQL (тип строки), ваш второй вызов дать ему два параметра, просто изменить код для форматирования SQL будет хорошо:

import sqlite3 

data = "Welcome" 

def cur_execute(data): 
    con = sqlite3.connect('sqlite3.db') 
    try: 
     with con: 
      cur = con.cursor() 
      cur.execute(data) 
      con.commit() 
    except Exception as why: 
     print(why) 
    finally: 
     if con: con.close() 

cur_execute("CREATE TABLE Hello(test TEXT)") 
cur_execute("INSERT INTO Hello VALUES('{0}')".format(data)) # format sql and call it 
+0

Сейчас он работает, thx aloooooooot – Deounix

+0

Hi; что, если я wan't вставить две данные data1 = "Добро пожаловать" data2 = "welcome2" cur_execute ("CREATE TABLE Hello (тест TEXT, test2 TEXT)") как я могу вставить data1 & data2 – Deounix

+0

Вам нужно вызвать функцию дважды. –

1

Вы определили свою cur_execute функцию только принимая один аргумент, а затем пытается передать ему два аргумента, как сказал зоосак.

Однако его метод по-прежнему уязвим для SQL-инъекции - вы должны позволить API базы данных обрабатывать форматирование строк. Вы хотите передать два аргумента своей функции, а не только одну. Вы можете попробовать:

import sqlite3 

data = "Welcome" 

def cur_execute(data,*args): 
    con = sqlite3.connect('sqlite3.db') 
    try: 
     with con: 
      cur = con.cursor() 
      if args is not None: 
       cur.execute(data,args) 
      else: 
       cur.execute(data) 
      con.commit() 
    except Exception as why: 
     print(why) 
    finally: 
     if con: con.close() 

cur_execute("CREATE TABLE Hello(test TEXT)") 
cur_execute("INSERT INTO Hello VALUES(?)", (data)) 
+0

ТНХ, я могу добавить две вещи, чтобы вставить как data1 = "welcome1" data2 = "welcome2" как я могу вставить его в таблицу THx – Deounix

2

@zoosuck отвечает, но он также удалил санузел sql, встроенный в библиотеку. Вы можете можете использовать встроенные в SQL обеззараживания путем осуществления следующих действий:

import sqlite3 

text = "Welcome" 

def cur_execute(data, args=()): 
    con = sqlite3.connect('sqlite3.db') 
    with con: 
     cur = con.cursor() 
     cur.execute(data, args) 
     con.commit() 

cur_execute("CREATE TABLE Hello(test TEXT)") 
cur_execute("INSERT INTO Hello VALUES(?)", (text,)) 

Пожалуйста, обратите внимание, что с with заявления, вам не нужно, чтобы закрыть соединение. Я удалил try catch вокруг соединения, чтобы показать полную ошибку, если ошибки действительно происходят.

Кроме того, возникла проблема с вашим исходным кодом. Второй аргумент в cur_execute("INSERT INTO Hello VALUES(?)", (text)) должен быть кортежем/списком.

+0

мега ответ, ТНХ :) – Deounix

2

Вы можете сделать это, как этот

# coding: utf-8 

import sqlite3 

text = "Welcome" 

def cur_execute(data, *args): 
    con = sqlite3.connect('sqlite3.db') 
    with con: 
     cur = con.cursor() 
     cur.execute(data, args) 
     con.commit() 

cur_execute("CREATE TABLE Hello(test TEXT)") 
cur_execute("INSERT INTO Hello VALUES(?)", text) 

Таким образом, вы сохранить функциональность cur.execute, чтобы избежать ваших входных данных. Это может предотвратить атаки SQL-инъекций.

Если вы хотите добавить 2 вещи в свой стол, вы можете назвать свою функцию подобной этой.

cur_execute("CREATE TABLE Hello2(test1 TEXT, test2 TEXT)") 
cur_execute("INSERT INTO Hello2 VALUES(?, ?)", text, "stuff") 

Это сделает другой стол с 2 текстовыми полями. Это то, что вы просили?

+0

Upvote для не нарушая SQL защита от атак на посадку –

+0

@ Андре Гай избил меня до этого :) –

Смежные вопросы