SQLAlchemy: значения классов не заполняются в таблице SQLite после преобразования csv в словари - PullRequest
0 голосов
/ 12 мая 2018

Я создал базу данных и классы SQLite, объявил свои столбцы и пытаюсь заполнить их данными из файла CSV, который я импортировал в Pandas и преобразовал в словарь.

Затем я использовал MetaData из SQLAlchemy для отображения таблиц, а затем я сохраняю ссылку на таблицы «измерения» и «станции» в их соответствующие переменные таблицы.Наконец, я вставляю данные в таблицы, однако, когда я получаю первые пять значений моих вставленных данных (чтобы убедиться, что вставка работает), я ничего не получаю.Я в недоумении, что я пропускаю или делаю неправильно?

# 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 Ответ

0 голосов
/ 12 мая 2018

Возможно, ваши запросы действий не фиксируются. По документам SQLAlchemy в контекстах ORM:

Функция «автокоммит» действует только тогда, когда нет транзакции в противном случае было объявлено. Это означает, что функция обычно не используется с ORM, так как объект Session по умолчанию всегда поддерживает текущая транзакция.

Рассмотрите возможность выполнения транзакций в диспетчере контекста , который обрабатывает коммиты и откаты.

...

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...