簡體   English   中英

將帶有時區感知列的 Pandas 作為字符串插入帶有 SQLAlchemy 的 SQL 服務器

[英]Insert Pandas with timezone-aware columns as string into SQL Server with SQLAlchemy

我正在努力將 JSON 數據插入到包含時區信息的 SQL 服務器中。 我知道數據類型 DATETIMEOFFSET 將不起作用。 我很高興將數據放在 VARCHAR 列中,稍后我可以將其轉換為真正的時區感知數據類型。

import pandas as pd
import json
from sqlalchemy import create_engine, NVARCHAR

json_data = json.dumps([{ "date" : "2019-08-13T11:12:05+02:00"}])
df = pd.read_json(json_data, dtype='object')

con='mssql+pyodbc://database'
engine = create_engine(con, encoding='utf-8', echo=False)

table_name = "load"
columns = {'date': NVARCHAR()}

print(df.dtypes)
df.to_sql(table_name, con=engine, if_exists='replace', dtype=columns, index=False)

無論我做什么,我總是在 SQL 服務器中獲得“2019-08-13 11:12:05.0000000”作為值。

如您所見,我試圖“說服”Python 在加載 dataframe 並將 NVARCHAR 設置為目標的數據類型時使用“對象”作為數據類型。 在某個地方,這仍然被翻譯成 DATETIME2(7)。

有沒有辦法,我可以將該時區感知字符串作為 SQL 服務器中的字符串?

一種直接的解決方案是在調用to_sql之前將 pandas Timestamp 列轉換為字符串:

json_data = json.dumps([{"date": "2019-08-13T11:12:05+02:00"}])
df = pd.read_json(json_data)

# convert pandas Timestamp column to string
df = df.astype({'date': numpy.str})

table_name = "#tmp"
df.to_sql(table_name, engine, if_exists='replace', index=False)

with engine.begin() as conn:
    print(conn.execute(f"SELECT * FROM [{table_name}]").fetchall())
    # [('2019-08-13 11:12:05+02:00',)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM