python - 带有 pyodbc 的 Pandas read_sql 来处理损坏的数据
问题描述
我正在与一个拥有 4D 数据库的客户合作。Tableau 不会连接到它。(这是另一个问题,如果你知道答案,请告诉我。)我们决定做的基本上是保留数据的两份副本。我正在用 Python 构建一个工具,它将从他们的数据库中获取任意表并将其副本存储在 MySQL 数据库中。然后它将定期运行并在添加新数据时更新数据。
我更喜欢使用 SqlAlchemy,但它不支持 4D。所以,我将 pyodbc 与熊猫一起使用。我在用着
data_chunks = pandas.read_sql("SELECT * FROM table_name", con=pyodbc_connection, chunksize=100000)
然后我转身使用
chunk_df.to_sql("table_name", con=sqlalchemy_mysql_connection, index=False, if_exists="append")
将其写入 MySQL 数据库。
不幸的是,在我正在阅读的一些表格中,存在损坏的数据,并且我得到了一个超出范围的ValueError
说法。The year xxxxx
跟踪中调用的最后一个函数是data = cursor.fetchmany(chunksize)
我相信来自 pyodbc 的。
如何从任意表中读取数据并能够优雅地处理损坏的数据并继续?
解决方案
您可以想象使用 pyodbc输出转换器函数来拦截损坏的日期值并使用类似于以下的代码“修复”它们:
def unpack_sql_type_timestamp(raw_bytes):
y, m, d, h, n, s, f = struct.unpack("<h5HI", raw_bytes)
if y > 9999:
y = 9999
elif y < 1:
y = 1
return datetime.datetime(y, m, d, h, n, s, f)
pyodbc_connection = pyodbc.connect(connection_string)
pyodbc_connection.add_output_converter(
pyodbc.SQL_TYPE_TIMESTAMP,
unpack_sql_type_timestamp
)
data_chunks = pandas.read_sql_query(
"SELECT * FROM table_name",
con=pyodbc_connection,
chunksize=100000
)
推荐阅读
- ios - ConfigData 框架在上传到 Apple Store 时未编译
- r - Rstudio pandoc问题
- regex - 正则表达式使用 Negative Lookahead 和 Negative Lookbehind 在多行 xml 中捕获字符串
- node.js - 使用 express 向客户端发送 cookie 不起作用
- linux - 如何使用 Bash 测试 hdfs 文件是否存在
- python - sess.run 在一个循环中
- gradle - 用 gradle 混淆生成的 fat jar
- r - 'train' 和 'class' 有不同的长度错误
- java - 如何为 org.apache.parquet.avro.AvroParquetReader 配置 S3 访问?
- javascript - 如何让我的页面知道页面加载时不存在的按钮