使用Python中的列名列表在MariaDB中创建表

使用Python中的列名列表在MariaDB中创建表,python,mysql,Python,Mysql,我正在尝试使用python在mariadb中创建一个表。我将所有列名存储在一个列表中,如下所示 collist=['RR','ABPm','ABPs','ABPd','HR','SPO'] 这只是示例列表。实际列表中有200项。我试图创建一个表,使用上面的collist元素作为列,列的数据类型是VARCHAR 这是我用来创建表的代码 对于collist中的p: cur.execute('CREATE TABLE IF NOT executes table1({}VARCHAR(45))”。格式(

我正在尝试使用python在mariadb中创建一个表。我将所有列名存储在一个列表中,如下所示

collist=['RR','ABPm','ABPs','ABPd','HR','SPO']

这只是示例列表。实际列表中有200项。我试图创建一个表,使用上面的collist元素作为列,列的数据类型是VARCHAR

这是我用来创建表的代码

对于collist中的p:
cur.execute('CREATE TABLE IF NOT executes table1({}VARCHAR(45))”。格式(p)


上面的代码正在执行,但只有列表的第一个元素被添加为表中的一列,我看不到其余的元素。如果我能得到这方面的帮助,我将不胜感激。

您可以分三部分构建字符串,然后
.join()
这些都在一起。中间部分是列定义,将原始列表中的每个项连接起来。这似乎并不特别健康;无论是列的数量还是所有内容都是VARCHAR(45),但这是您的决定:

collist = ['RR', 'ABPm', 'ABPs', 'ABPd', 'HR', 'SPO']

query = ''.join(["(CREATE TABLE IF NOT EXISTS table1 ",
                ' VARCHAR(45), '.join(collist),
                ' VARCHAR(45))'])
因为我们使用了
join
,所以需要单独指定最后一列类型(列表中的第三项)才能正确关闭查询


注意:如果输入数据来自用户输入,那么这很容易受到SQL注入的影响,因为您只是在中格式化未知字符串以执行。我假设列名列表是程序内部的。

缺点是当
collist
由用户控制时,很可能会进行注入其他SQL语句。@RaymondNijland这是无法避免的。你不能用参数化来转义列名,你也没有模式来比较输入是否合法。我不确定我是否看到有人手动输入200个列名的用例,though@RaymondNijland因为我一直在谈论SQL注入,我想我应该在我的答案中添加一个通知;我假设这是内部的。MySQL是你的标签,所以我想知道是否有一个更安全的方法,而不需要手动完成全部工作:)“你不能用参数化来转义列名”,这是一个选择、更新、,删除查询将是查询
信息\u schema.TABLES,其中TABLE\u NAME=
,并将所选结果用于动态查询<代码>信息\u模式。表包含安全数据。@RaymondNijland您应该发布一个答案,伙计,您已经完成了这里的工作!