Python 使用sqlalchemy从Pandas Dataframe到pyodbc(Azure SQL DB):从字符串转换日期和/或时间时转换失败
我正试图通过在Azure Databricks上启动Python脚本,以增量方式将Salesforce数据加载到Azure SQL数据库 由于我无法在Azure Databricks中安装Devart ODBC,因此我尝试使用simple_salesforce从salesforce获取数据: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
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