2017-01-04 10 views
5

ETL प्रक्रिया के दौरान मुझे एक पोस्टग्रेस डेटाबेस से दूसरे में JSON कॉलम निकालने और लोड करने की आवश्यकता होती है। हम इसके लिए पांडों का उपयोग करते हैं क्योंकि विभिन्न स्रोतों/गंतव्यों से डेटा पढ़ने और लिखने के कई तरीके हैं और सभी परिवर्तन पायथन और पांडों का उपयोग करके लिखे जा सकते हैं। हम ईमानदार होने के दृष्टिकोण से काफी खुश हैं .. लेकिन हमने एक समस्या को मारा।पांडस का उपयोग कर पोस्टग्रेस में जेएसओएन कॉलम लिखना .to_sql

आमतौर पर डेटा को पढ़ने और लिखना काफी आसान है। आप स्रोत से डेटा पढ़ने के लिए pandas.read_sql_table का उपयोग करें और इसे गंतव्य पर लिखने के लिए pandas.to_sql का उपयोग करें। लेकिन, चूंकि स्रोत तालिकाओं में से एक के पास जेएसओएन (पोस्टग्रेस से) के कॉलम थे, to_sql फ़ंक्शन निम्न त्रुटि संदेश से क्रैश हो गया था।

df.to_sql(table_name, analytics_db) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/pandas/core/generic.py", line 1201, in to_sql 
    chunksize=chunksize, dtype=dtype) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/pandas/io/sql.py", line 470, in to_sql 
    chunksize=chunksize, dtype=dtype) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/pandas/io/sql.py", line 1147, in to_sql 
    table.insert(chunksize) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/pandas/io/sql.py", line 663, in insert 
    self._execute_insert(conn, keys, chunk_iter) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/pandas/io/sql.py", line 638, in _execute_insert 
    conn.execute(self.insert_statement(), data) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 945, in execute 
    return meth(self, multiparams, params) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/sqlalchemy/sql/elements.py", line 263, in _execute_on_connection 
    return connection._execute_clauseelement(self, multiparams, params) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1053, in _execute_clauseelement 
    compiled_sql, distilled_params 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1189, in _execute_context 
    context) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1393, in _handle_dbapi_exception 
    exc_info 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/sqlalchemy/util/compat.py", line 202, in raise_from_cause 
    reraise(type(exception), exception, tb=exc_tb, cause=cause) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1159, in _execute_context 
    context) 
    File "/home/ec2-user/python-virtual-environments/etl/local/lib64/python2.7/site-packages/sqlalchemy/engine/default.py", line 459, in do_executemany 
    cursor.executemany(statement, parameters) 
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'dict' 

उत्तर

8

मैं एक समाधान के लिए वेब की खोज कर रहा है, लेकिन किसी भी इसलिए यहाँ नहीं पा सके है कि हम क्या के साथ आया था (वहाँ बेहतर तरीके हो सकते हैं लेकिन कम से कम यह एक शुरुआत है, तो किसी और को इस में चलाता है)।

to_sql में dtype पैरामीटर निर्दिष्ट करें।

हम से गए: df.to_sql(table_name, analytics_db) से df.to_sql(table_name, analytics_db, dtype={'name_of_json_column_in_source_table': sqlalchemy.types.JSON}) और यह बस काम करता है।

संबंधित मुद्दे