Python 使用sqlalchemy从Pandas Dataframe到pyodbc(Azure SQL DB):从字符串转换日期和/或时间时转换失败

Python 使用sqlalchemy从Pandas Dataframe到pyodbc(Azure SQL DB):从字符串转换日期和/或时间时转换失败,python,sqlalchemy,azure-sql-database,pyodbc,simple-salesforce,Python,Sqlalchemy,Azure Sql Database,Pyodbc,Simple Salesforce,我正试图通过在Azure Databricks上启动Python脚本,以增量方式将Salesforce数据加载到Azure SQL数据库 由于我无法在Azure Databricks中安装Devart ODBC,因此我尝试使用simple_salesforce从salesforce获取数据: import pandas as pd import pyodbc from simple_salesforce import Salesforce, SalesforceLogin, SFType fro

我正试图通过在Azure Databricks上启动Python脚本,以增量方式将Salesforce数据加载到Azure SQL数据库

由于我无法在Azure Databricks中安装Devart ODBC,因此我尝试使用simple_salesforce从salesforce获取数据:

import pandas as pd
import pyodbc
from simple_salesforce import Salesforce, SalesforceLogin, SFType
from sqlalchemy.types import Integer, Text, String, DateTime
from sqlalchemy import create_engine
import urllib

sf = Salesforce(password = password, username=username, security_token=jeton)
rep_qr = "SELECT SOMETHING FROM Account WHERE CONDITION"
soql = prep_qr.format(','.join(field_names))
results = sf.query_all(soql)['records']
我得到以下结果(示例):

然后我将输出转换为数据帧:

results = pd.DataFrame(sf.query_all(soql)['records'])
results.drop(columns=['attributes'], inplace=True) #to keep only the columns
我得到了这样的东西(只是一个例子):

身份证件 名称 日期 XY1 Y 2020-11-24T09:16:17.000+0000
如果日期/时间值始终以字符串形式返回,格式为
2020-11-24T11:22:33.000+0000
,则可以使用pandas的
.apply()
方法将字符串转换为SQL Server将接受的
2020-11-24 11:22:33.000
格式:

df=pd.DataFrame(
[
(1,“2020-11-24T11:22:33.000+0000”),
(二,无),,
(3,“2020-11-24T12:13:14.000+0000”),
],
列=[“id”,“dtm”],
)
打印(df)
“”“控制台输出:
id dtm
01 2020-11-24T11:22:33.000+0000
1 2无
232020-11-24T12:13:14.000+0000
"""
df[“dtm”]=df[“dtm”]。应用(lambda x:x[:23]。如果x没有,则替换(“T”,“”)
打印(df)
“”“控制台输出:
id dtm
0   1  2020-11-24 11:22:33.000
1 2无
2   3  2020-11-24 12:13:14.000
"""
df.to_sql(
表格名称,
引擎,
索引=假,
如果_exists=“append”,
)
使用engine.begin()作为conn:
pprint(conn.execute(sa.text(f“SELECT*FROM{table_name}”)).fetchall()
“”“控制台输出:
[(1,datetime.datetime(2020,11,24,11,22,33)),
(二,无),,
(3,datetime.datetime(2020,11,24,12,13,14))]
"""

如果要附加到现有表(
If_exists=“append”
),则可以反映表元数据,并查看哪些列是datetime、datetime2等。。如果您正在创建新表,那么这些列将被创建为varchar/nvarchar,如果需要,这些字符串可以稍后转换为适当的datetime(等)值。您能告诉我们如何反映表的元数据吗?类似于
SELECT COLUMN\u NAME,数据\u类型来自信息\u SCHEMA.COLUMNS,其中表\u NAME='account'
感谢您的回复。这里的问题是,我正在尝试自动化这个过程。我从salesforce中摄取了大约100个表(每个表包含数十列)。我之所以要寻找一种方法(如果存在的话),它可以自动将数据类型从dataframe中的类型转换为PyODBC中所需的类型。当simple_salesforce返回datetime值时,[1]是否总是以字符串(
str
)形式返回,[2]总是以
+0000
结尾?
results = pd.DataFrame(sf.query_all(soql)['records'])
results.drop(columns=['attributes'], inplace=True) #to keep only the columns