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

时间:2009-10-01 12:16:58

标签: python sql database database-design postgresql

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

让我举个例子:格式化日期列的方法有多种,例如:使用

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

例如,我想在运行时从另一个表动态查询to_char()内置的第二个参数,然后在它有值时应用。

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

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

2 个答案:

答案 0 :(得分:0)

在我看来,stored procedure或子选择在这里可以正常工作,但我还没有测试过。假设您在date_format表中为每个用户存储users

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

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

答案 1 :(得分:0)

将日期作为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格式存储您的数据库值,以便您可以应用用户特定的时区格式化时的设置,而不必考虑它们用于所有数据库操作。