Python函数重用
我在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
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的评论在这种情况下似乎更合理。仍然希望看到参数等的工作示例