Python SQL中的动态列格式-以及用于存储格式的后端

Python SQL中的动态列格式-以及用于存储格式的后端,python,sql,database,database-design,postgresql,Python,Sql,Database,Database Design,Postgresql,我试图用Python创建一个系统,在这个系统中,可以从一组表中选择许多行,这些表将以用户定义的方式进行格式化。假设表a有一组列,其中一些列包括date或timestamp值。每个列的用户定义格式应存储在另一个表中,并在运行时查询和应用于主查询 让我举一个例子:有不同的方式格式化日期列,例如使用 SELECT to_char(column, 'YYYY-MM-DD') FROM table; 在PostgreSQL中 例如,我希望在运行时从另一个表动态查询to_char()内置的第二个参数,如果

我试图用Python创建一个系统,在这个系统中,可以从一组表中选择许多行,这些表将以用户定义的方式进行格式化。假设表
a
有一组列,其中一些列包括
date
timestamp
值。每个列的用户定义格式应存储在另一个表中,并在运行时查询和应用于主查询

让我举一个例子:有不同的方式格式化日期列,例如使用

SELECT to_char(column, 'YYYY-MM-DD') FROM table;
在PostgreSQL中

例如,我希望在运行时从另一个表动态查询
to_char()
内置的第二个参数,如果它有值,则应用该参数

从表中读取定义本身并不是什么大问题,而不是创建一个数据库方案,该方案将从用户界面接收数据,用户可以从中选择要应用于不同列的格式化指令。用户应该能够选择要包含在用户查询中的用户列集,以及每个列的用户定义格式

几天来,我一直在考虑以一种优雅而高效的方式来做这件事,但都没有用。让用户在文本字段中输入用户想要的定义,并将其包含在查询中,几乎会产生SQL注入攻击的邀请(尽管我可以使用
escape()
函数),并且存储所有可能的组合对我来说似乎也不可行

在我看来,一个或一个子选择在这里会很好地工作,尽管我还没有测试过它。假设您在
users
表中为每个用户存储了
date\u格式

SELECT to_char((SELECT date_format FROM users WHERE users.id=123), column) FROM table;

您的里程数可能会有所不同。

将日期提取为Unix时间戳,并用Python格式化:

SELECT DATE_PART('epoch', TIMESTAMP(my_col)) FROM my_table;

my_date = datetime.datetime.fromtimestamp(row[0]) # Or equivalent for your toolkit
我发现这种方法有两个优点:unix时间戳是最节省空间的通用格式(这种方法实际上与语言无关),而且因为您查询数据库时使用的语言比底层数据库更丰富,如果您开始想要像“今天”这样更友好的格式设置,您可以有很多选择,“昨天”、“上周”、“6月23日”


我不知道你正在开发什么样的应用程序,但是如果它是一个Web应用程序,它将被多人使用,我也会考虑在UTC中存储你的数据库值,这样你就可以在格式化时应用用户特定的时区设置,而不必为所有的数据库操作考虑它们。

嗨,克里斯,谢谢你的回答。我非常确定PostgreSQL实际上能够存储带有时区的时间戳,这也可以创建一种通用格式来存储它们。此外,“今天”、“昨天”、“明天”等都是PostgreSQL中支持的日期输入类型。我的主要问题仍然是在一个表中存储和检索格式定义。好的-我通常建议不要在数据库中使用格式,否则听起来patcoll的建议更接近您想要的。嗨patcoll,谢谢您的回答。这看起来真的很有希望。我试试看。剩下的问题是为每个用户存储不同数量、不同格式的列。