当前位置: 首页 > 知识库问答 >
问题:

SqlAlchemy Oracle DataTime格式

孟鸿朗
2023-03-14

我使用SqlAlchemy查询Oracle数据库并将结果存储在csv文件中。

我想为要写入的日期指定一种全局格式,如下所示:

'DD-MM-YYYY HH24:MI:SS'.

我已经在系统上设置了NLS_DATE_FORMAT。

例如:

datetime.datetime(2016, 12, 22, 13, 12, 35)

最终将:

2004-12-22 13:12:35

我想:

22-12-2004 13:12:35

当我处理数百个表时,我无法“手动”应用“strftime”。

共有2个答案

陈飞语
2023-03-14

也许我的目的和你一样。

我只想打印(行)已格式化日期时间,而不是数据时间。日期时间(y、m、d…事物。

我尝试了几种方法(关于处理datetime):

  • sql level convert使用funcdate\u format//与sql方言相关的
    从设备中选择*,date\u format(上次登录,“%m-%d-%Y”)
    //函数。date\u格式,func。至\u char
  • 将RowProxy转换为普通dict//不同的访问样式
  • 自定义JSON。编码器//仅用于json字符串化
    https://stackoverflow.com/a/22238613/4896468
  • 继承RowProxy//我认为入侵性较小

只需在这里解释继承方式:

原始行

>>> type(row)
<class 'aiomysql.sa.result.RowProxy'>

>>> row
(4982, '203233D81914', False, datetime.datetime(2021, 6, 28, 19, 30, 6))

>>> row.last_login
datetime.datetime(2021, 6, 28, 19, 30, 6)

我那一排

>>> my_row = my_proxy(row)
>>> my_row
(4982, '203233D81914', False, '2021-06-28 19:30:06')

>>> my_row.last_login
'2021-06-28 19:30:06'

继承RowProxy并重写(根据需要任意重写)

  • __repr__(用于打印)
  • __getattr__(用于. xxx文件访问)
from datetime import datetime

class my_proxy(proxy_type):
  # refer orig RowProxy implement
  def __init__(self, row):
    self._result_proxy = row._result_proxy
    self._row = row._row
    self._processors = row._processors
    self._keymap = row._keymap
  # for print
  def __repr__(self): 
    # return ' xx:'+ repr(self.as_tuple())
    return repr(tuple(v.strftime('%F %T') if type(v)==datetime else v for v in self.as_tuple()))
  # for field access
  def __getattr__(self, name):
    try:
      # return self[name]
      v = self[name]
      return v.strftime('%F %T') if type(v)==datetime else v
    except KeyError as e:
      raise AttributeError(e.args[0])

proxy_type=类型(行)

这是aiomysql.sa.result.RowProxy

代码基于

  • aiomysql 0.0.22
  • SQLAlchemy 1.4.31

尤其是\uuu init\uuuu函数:
 github:aimysql/sa/result。py#L22

不同的版本可能会有所不同。

欧阳哲
2023-03-14

我找到了解决这个问题的方法。

是的,可以将日期转换为具有适当格式的字符。但是,在我的例子中,SQL语句是由另一个模块提供的,我需要处理100多个表。

因此,我决定使用由SqlAlchemy通过执行()方法返回的ResultProxy对象中包含的数据。

我一次按1000行的块(块是经典类型列表)获取一个表。但这些行是一种元组(更准确地说是SqlAlchemy RowProxy对象),它无法修改。

因此,我对它们进行了处理,将它们按顺序排列,并更新组块列表。

使用“集合”很重要。OrderedDict’因为它保持字段的顺序。对于经典dic,则字段标签和值可能不匹配。

现在,我的区块可以进行各种处理(将日期更改为具有适当格式的字符串,在VARCHAR字符串中替换char,等等……)。字典结构非常适合这一点。

请注意,在写入之前,必须回溯区块列表中的OrderedDic行。

result_proxy = connection.execute(request)
while True:
    chunk = self.result_proxy.fetchmany(1000)
    if not chunk:
        break
    # treatments comes here after :

    # 1- transform into a dic in order to be able to modify
    for i, row in enumerate(chunk):
        chunk[i] = OrderedDict(row)

    # 2- clean dates
    for i, row_odic in enumerate(chunk):
        for item in row_odic:
            if(type(row_odic[item]) is datetime.datetime):
                row_odic[item] = str(row_odic[item].strftime("%d/%m/%Y"))
        chunk[i] = row_odic

    # Other data treatment

    # cast back for it to look like a classical result :
    for c, row_odic in enumerate(chunk):
        self.chunk[c] = row_odic.values()

    # finally write row_odic.values in the csv file

我不确定这是否是最有效的解决方案,但性能看起来不错。我有一个版本的这种处理(相同数量的数据),但使用Pandas库,执行起来有点长。

 类似资料:
  • 我正在使用ColdFusion和SpreadsheetNew、SpreadsheetAddRow、SpreadsheetFormatRow等函数创建Excel文件。根据我在这里阅读的文档,它们是颜色和fgColor的属性。我有点困惑两者之间的区别。一个是文本颜色,另一个是背景颜色吗?我一直在使用fgColor来设置行的背景颜色。 我的主要问题是,根据文档,我可以在颜色类作为我的颜色。然而,我真的需

  • 通过 Matplotlib axes 对象提供的 grid() 方法可以开启或者关闭画布中的网格(即是否显示网格)以及网格的主/次刻度。除此之外,grid() 函数还可以设置网格的颜色、线型以及线宽等属性。 grid() 的函数使用格式如下: grid(color='b', ls = '-.', lw = 0.25) 参数含义如下: color:表示网格线的颜色; ls:表示网格线的样式; lw:

  • 问题内容: 我正在创建一个HTML表,将在Excel中作为电子表格打开。我可以使用哪种HTML标记或CSS样式“讲述” Excel以将单元格的内容显示为文本? 问题答案: 您可以将格式应用于数字,文本,日期等的单元格。 请参阅我以前关于此的答案:HTML toExcel:如何告诉Excel将列视为数字? (已调整的代码段) 如果将CSS类添加到页面: 并在您的TD上拍那些课,行得通吗?

  • 編輯格式的設計,將焦點放在「簡潔易用」與「易讀性」。 GitBook 使用 Markdown 這種輕量級標記語法作為編輯格式的設計基礎。 在包含實際內容的檔案之外,GitBook 添加了一些額外的參照檔: README:一本書的介紹文字。 SUMMARY:定義章節的架構與順序。 LANGS:多種翻譯版本的設定。 GLOSSARY:詞彙表與定義描述。 除了內容檔案外,一本書至少需要添加 README

  • 缩进 小技巧 缩进两个空格,没有制表符。 在代码块之间请使用空行以提升可读性。缩进为两个空格。无论你做什么,请不要使用制表符。对于已有文件,保持已有的缩进格式。 行的长度和长字符串 小技巧 行的最大长度为80个字符。 如果你必须写长度超过80个字符的字符串,如果可能的话,尽量使用here document或者嵌入的换行符。长度超过80个字符的文字串且不能被合理地分割,这是正常的。但强烈建议找到一个

  • 本文档是一个正在进展的工作,在具体实现过程中将会有所改变。详细信息请查看 现状 页面。 介绍 JSON API 是数据交互规范,用以定义客户端如何获取与修改资源,以及服务器如何响应对应请求。 JSON API设计用来最小化请求的数量,以及客户端与服务器间传输的数据量。在高效实现的同时,无需牺牲可读性、灵活性和可发现性。 JSON API需要使用JSON API媒体类型(application/vn

  • 我们可以看到格式化就是通过格式字符串得到特定格式: format!("{}", foo) -> "3735928559" format!("0x{:X}", foo) -> "0xDEADBEEF" format!("0o{:o}", foo) -> "0o33653337357" 根据使用的参数类型,同样的变量(foo)能够格式化成不同的形式:X, o 和未指定形式。 这个格式化的功能是通过 t

  • 我的FXML中有一个DatePicker,我需要Date将其插入我的SQL数据库。我想格式化我的Date,但它不起作用。 这就是我得到的错误。 我还是个初学者。在过去的3到4个月里,我一直使用Java。我正在尽力提高。