Python函数重用

Python函数重用,python,function,Python,Function,我在python代码中定义了一个函数,如下所示: def insert_source(): sql = "INSERT INTO public.source (width, height, sha1) " \ "VALUES (%s, %s, %s)" conn = None data = widtho, heighto, sha1o try: # read database config

我在python代码中定义了一个函数,如下所示:

def insert_source():
    sql = "INSERT INTO public.source (width, height, sha1) " \
          "VALUES (%s, %s, %s)"
    conn = None
    data = widtho, heighto, sha1o
    try:
        # read database configuration
        params = config()
        # connect to the PostgreSQL database
        conn = psycopg2.connect(**params)
        # create a new cursor
        cur = conn.cursor()
        # execute the INSERT statement
        cur.execute(sql, data)
        # commit the changes to the database
        conn.commit()
        print('Source image data successfully imported', sha1o)
        # close communication with the database
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        if str(error) in "duplicate key value violates unique constraint":
            raise
        else:
            print("I've seen this image before, skipping insert")
    finally:
        if conn is not None:
            conn.close()
            return id

if __name__ == '__main__':
    insert_source()
这可以正常工作,并按预期插入或抛出异常。但是现在在我的脚本后面,我想在同一个db中的不同表中写入更多数据。我应该复制/粘贴上面的整个函数并对其重命名,还是有更好的方法来说做这些事情,但sql和数据应该是X


FWIW复制该函数会产生一个
重复的代码片段(31行长)
请注意,当我总共需要更改4行代码时,复制98%的代码似乎很愚蠢。

您可以向函数添加参数,例如表名、插入的内容和值。。因此,您的函数将类似于:

def insert_源(表名称、内容到插入、值):
sql=f“插入到{table_name}{things_to_INSERT}值{VALUES}”
conn=无
数据=宽度、高度、高度
尝试:
#读取数据库配置
params=config()
#连接到PostgreSQL数据库
conn=psycopg2.connect(**参数)
#创建一个新光标
cur=连接光标()
#执行INSERT语句
当前执行(sql、数据)
#将更改提交到数据库
康涅狄格州提交
打印('成功导入源图像数据',sha1o)
#与数据库的密切通信
当前关闭()
除了(异常,psycopg2.DatabaseError)作为错误:
如果“重复键值”中的str(错误)违反了唯一约束:
提升
其他:
打印(“我以前见过此图像,跳过插入”)
最后:
如果conn不是无:
康涅狄格州关闭
返回id
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
表_name='public.source'
东西到插入物=(宽度、高度、sha1)
值='(%s,%s,%s)'
插入源(表名、内容、值)
这正是代码所做的,您可以自定义参数以使函数可重用

但是,正如Ted Klein Bergman在评论中所说,这种方式是SQL注入的最佳选择。
因此,您需要做的是按照克莱恩的建议进行准备/参数化查询。

最后一段不是已经回答了您的问题吗?这个函数做了很多工作。它从某处读取数据库配置,建立数据库连接,插入新数据,打印到控制台,并处理错误。我首先将它重构成更小的片段。是的,但是KEY如何使用4行需要改变的参数。考虑改变你的函数,所以把SQL和数据作为参数,例如,<代码> DEF插入源(SQL,data):< /代码>。不,不要这样做!这是SQL注入的完美候选者!不要对SQL查询使用字符串插值!相反,使用准备好的/参数化的查询。@TedKleinBergman让我们看看您的答案:)@Tony您的问题是关于设计的,因此高度依赖于您的实际用例、周围的设计和需求。大多数答案都是主观的或基于设计范例的建议。我们的目标是,原始字符串插值是SQL注入的候选对象,也是最常见和最具破坏性的网络攻击之一。@Tony的评论在这种情况下似乎更合理。仍然希望看到参数等的工作示例