在Python 3的表中插入未知错误

在Python 3的表中插入未知错误,python,python-3.x,sqlite,Python,Python 3.x,Sqlite,我试图在Python3中创建一个类来访问Sqlite3中的数据库。 数据库已创建,当我检查是否将其插入数据库时,我在init方法的第二行得到以下错误: File "~/implementacao 2/Dabase_Connection.py", line 16, in __init__ self.insert_in_database('database_name.db','table_name', '(\'111\',\'qqqq\')') File "~/implementacao

我试图在Python3中创建一个类来访问Sqlite3中的数据库。 数据库已创建,当我检查是否将其插入数据库时,我在init方法的第二行得到以下错误:

File "~/implementacao 2/Dabase_Connection.py", line 16, in __init__
    self.insert_in_database('database_name.db','table_name', '(\'111\',\'qqqq\')')
  File "~/implementacao 2/Dabase_Connection.py", line 33, in insert_in_database
    c.execute('INSERT INTO '+ table_name + ' VALUES ( '+ data +' )')# Insert a row of data
sqlite3.OperationalError: near ",": syntax error
代码如下:

def __init__(self):
        # self.create_database('database_name.db', 'table_name', 'id TEXT, data TEXT')
        self.insert_in_database('database_name.db','table_name', '(\'111\',\'qqqq\')')
        # self.delete_from_database('database_name.db', 'table_name', 'data1')
        # self.update_in_database('database_name.db','table_name', 'data', 'data_nova', 'data1')
        # self.insert_all_in_database('database_name.db', 'table_name', [('data1','data1'),('data2','data2'),('data3','data3'),('data4','data4')])
        # self.Search_in_database('database_name.db', 'table_name', 'data')


def create_database(self,database_name,table_name,table_args):
    conn = sqlite3.connect(database_name)
    c = conn.cursor()
    c.execute('CREATE TABLE '+ table_name + '(' + table_args + ')')# Create table
    conn.commit() # Save (commit) the changes
    conn.close()# We can also close the connection if we are done with it.

# INSERT INTO prontuarios VALUES(id,prontuario);
def insert_in_database(self,database_name,table_name, data):
    conn = sqlite3.connect(database_name)
    c = conn.cursor()
    c.execute('INSERT INTO '+ table_name + ' VALUES ( '+ data +' )')# Insert a row of data
    conn.commit() # Save (commit) the changes
    conn.close()# We can also close the connection if we are done with it.

def delete_from_database(self,database_name,table_name, chave):
    conn = sqlite3.connect(database_name)
    c = conn.cursor()
    c.execute('DELETE FROM ' + table_name +' WHERE Id= '+ chave +' ; ')# Insert a row of data
    conn.commit() # Save (commit) the changes
    conn.close()# We can also close the connection if we are done with it.

def update_in_database(self,database_name,table_name, table_field, data, chave):
    conn = sqlite3.connect(database_name)
    c = conn.cursor()
    c.execute('UPDATE ' +table_name+ ' SET ' + table_field + ' = ' + data + ' WHERE id = ' + chave+' ;')# Insert a row of data
    conn.commit() # Save (commit) the changes
    conn.close()# We can also close the connection if we are done with it.

# persons = [("Hugo", "Boss"),("Calvin", "Klein")]
# Fill the table conn.executemany("'"insert into person(firstname, lastname) values (?, ?)", persons)

def insert_all_in_database(self,database_name,table_name, data):
    data_interrog = self.get_parameters(data)
    conn = sqlite3.connect(database_name)
    c = conn.cursor()
    c.executemany('insert into ' + table_sifnature + ' values ( '+ data_interrog +' ) ', data)
    conn.commit() # Save (commit) the changes
    conn.close()# We can also close the connection if we are done with it.


def Search_in_database(self,database_name,table_name, fields):
    conn = sqlite3.connect(database_name)
    c = conn.cursor()
    # Print the table contents
    for row in c.execute('select '+ fields + ' from ' +table_name):
        print(row)

问题是数据的参数,如果打印生成的sql,其格式不正确,则会:

INSERT INTO table_name VALUES ( ('111','qqqq') )
将第二行更改为:

self.insert_in_database('database_name.db','table_name', '\'111\',\'qqqq\'')
或:


问题是数据的参数,如果打印生成的sql,其格式不正确,则会:

INSERT INTO table_name VALUES ( ('111','qqqq') )
将第二行更改为:

self.insert_in_database('database_name.db','table_name', '\'111\',\'qqqq\'')
或:

您的代码易受Sql注入攻击! python页面引用了如下内容:

通常,SQL操作需要使用Python中的值 变量您不应该使用Python的字符串组合查询 因为这样做是不安全的;它使你的程序 易受SQL注入攻击

正如在其他评论中提到的,我强烈建议您使用ORM,而不是像您那样编写简单的sql查询


当我试图连接到
sqlite3
db时,我通常会使用这样的方式:

class SqliteDB:
    def __init__(self):
        self.parent_directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        self.db_path = os.path.join(self.parent_directory, 'db.sqlite3')
        self.db_connection = sqlite3.connect(self.db_path)
        self.db_cursor = self.db_connection.cursor()

    def execute(self, query, args=''):
        return self.db_cursor.execute(query, args)

    def commit(self):
        self.db_connection.commit()

    def close(self):
        self.db_connection.close()
基于上述类,您可以轻松构建所需的其他方法(
update
delete
等)。

您的代码容易受到Sql注入的攻击! python页面引用了如下内容:

通常,SQL操作需要使用Python中的值 变量您不应该使用Python的字符串组合查询 因为这样做是不安全的;它使你的程序 易受SQL注入攻击

正如在其他评论中提到的,我强烈建议您使用ORM,而不是像您那样编写简单的sql查询


当我试图连接到
sqlite3
db时,我通常会使用这样的方式:

class SqliteDB:
    def __init__(self):
        self.parent_directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        self.db_path = os.path.join(self.parent_directory, 'db.sqlite3')
        self.db_connection = sqlite3.connect(self.db_path)
        self.db_cursor = self.db_connection.cursor()

    def execute(self, query, args=''):
        return self.db_cursor.execute(query, args)

    def commit(self):
        self.db_connection.commit()

    def close(self):
        self.db_connection.close()

基于上述类,您可以轻松地构建所需的其他方法(
update
delete
等)。

不必使用手工制作的SQL。使用ORM(SqlAlchemy Leap to mind)或者如果这是一个Web应用程序,Django这不是一个Web应用程序,它只是为了将我的文件保存在数据库中以保持算法的快速性。然后使用SqlAlchemy打印生成的SQL,您将看到问题。如果没有,请编辑您的问题并添加打印的查询。不要使用手工制作的SQL。使用ORM(SqlAlchemy Leap to mind)或者如果这是一个Web应用程序,Django这不是一个Web应用程序,它只是为了将我的文件保存在数据库中以保持算法的快速性。然后使用SqlAlchemy打印生成的SQL,您将看到问题。如果没有,请编辑您的问题并添加打印的查询。那么如何执行Crud操作以及如何在Python上调用此方法Im new?如何执行Crud操作以及如何在Python上调用此方法Im new