>

SQLite 데이터베이스와 클래스를 만들고 열을 선언했으며 Pandas에서 가져온 csv 파일의 데이터로 채워서 사전으로 변환하려고합니다.

그런 다음 SQLAlchemy의MetaData를 사용하여 테이블을 반영한 다음 'measurement'및 'station'테이블에 대한 참조를 해당 테이블 변수에 저장합니다. 마지막으로 데이터를 테이블에 삽입하지만 삽입 된 데이터의 처음 5 개 값을 가져 와서 (삽입이 작동했는지 확인) 아무것도 얻지 못합니다. 난 당황하고 있는데, 무엇을 놓치고 있거나 잘못하고 있습니까?

# Dependencies and boilerplate
import sqlalchemy
from sqlalchemy import Column, Float, Integer, String, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, inspect, func, MetaData
engine = create_engine("sqlite:///Resources/hawaii.sqlite")
conn = engine.connect()
Base = declarative_base()
class Measurement(Base):
    __tablename__ = "measurement"
    id = Column(Integer, primary_key=True)
    station = Column(Text)
    date = Column(Text)
    prcp = Column(Float) 
    tobs = Column(Integer)
    def __repr__(self):
        return f"id={self.id}, name={self.name}"

class Station(Base):
    __tablename__ = "station"
    id = Column(Integer, primary_key=True)
    station = Column(Text)
    name = Column(Text)
    latitude = Column(Float)
    longitude = Column(Float)
    elevation = Column(Float)
    def __repr__(self):
        return f"id={self.id}, name={self.name}"
# Create a "Metadata" Layer That Abstracts our SQL Database
# ----------------------------------
Base.metadata.tables # Right now, this table only exists in python and not in the actual database
Base.metadata.create_all(engine) # Create the 2 tables within the database
# csv to df to dict.
cm_df = "resources/clean_measurements.csv"
cs_df = "resources/clean_stations.csv"
cm_df = pd.read_csv(cm_df)
cs_df = pd.read_csv(cs_df)
cm_df=cm_df.drop(['Unnamed: 0'], axis=1).reset_index(drop=True)
cs_df=cs_df.drop(['Unnamed: 0'], axis=1).reset_index(drop=True)
cm_dic = cm_df.to_dict(orient='records')
cs_dic = cs_df.to_dict(orient='records')
# Use MetaData from SQLAlchemy to reflect the tables
metadata = MetaData(bind=engine)
metadata.reflect()
# Populate SQLITE Table for Measurement_df
m_table = sqlalchemy.Table('measurement', metadata, autoload=True)
conn.execute(m_table.delete())
conn.execute(m_table.insert(), cm_dic)
# Populate SQLITE Table for stations_df
s_table= sqlalchemy.Table('station', metadata, autoload=True)
conn.execute(s_table.delete())
conn.execute(s_table.insert(), cs_dic)
conn.execute("select * from measurement Limit 5").fetchall()
>>> [(1,), (2,), (3,), (4,), (5,)]
conn.execute("select * from station limit 5").fetchall()
>>> [(1,), (2,), (3,), (4,), (5,)]

  • 답변 # 1

    아마도 액션 쿼리가 커밋되지 않았습니다. ORM 컨텍스트의 SQLAlchemy 문서 당 :

    와이즈 비즈

    커밋 및 롤백을 처리하는 컨텍스트 관리자에서 트랜잭션 실행을 고려하십시오.

    The “autocommit” feature is only in effect when no Transaction has otherwise been declared. This means the feature is not generally used with the ORM, as the Session object by default always maintains an ongoing Transaction.

    ... with engine.begin() as cn: cn.execute(m_table.delete()) cn.execute(m_table.insert(), cm_dic) ... with engine.begin() as cn: cn.execute(s_table.delete()) cn.execute(s_table.insert(), cs_dic) ... engine.execute("select * from measurement Limit 5") engine.execute("select * from station limit 5")

  • 이전 java - Class1에는 ArrayList 가 있지만 Class2에는 단일 Class1 인스턴스가 있습니까?
  • 다음 php - 지원 중단으로 인해 homebrew를 통해 memcached를 설치할 수 없습니다 PECL도 작동하지 않습니다