前回の記事でSQLAlchemyでSQLiteのデータベースを作成するコードを紹介しました
今回は作成したデータベースに追加で編集するコードを紹介していきます
・データベースに追加
既にあるデータベースのテーブルに、辞書型データを追加するコードです
from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# データベース接続設定
DATABASE_URL = "sqlite:///example.db" # SQLiteを使用
engine = create_engine(DATABASE_URL, echo=True)
# ベースクラス作成
Base = declarative_base()
# テーブル定義
class ExampleTable(Base):
__tablename__ = 'example_table'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String, nullable=False)
age = Column(Integer, nullable=False)
score = Column(Float, nullable=False)
# テーブル作成
Base.metadata.create_all(engine)
# データを追加するコード
Session = sessionmaker(bind=engine)
session = Session()
# 追加するデータのリスト
data_to_add = [
{"name": "Alice", "age": 25, "score": 85.5},
{"name": "Bob", "age": 30, "score": 90.0},
{"name": "Charlie", "age": 22, "score": 78.0}
]
try:
# データをテーブルに追加
for data in data_to_add:
record = ExampleTable(
name=data['name'],
age=data['age'],
score=data['score']
)
session.add(record) # セッションに追加
session.commit() # トランザクションを確定
print("データが正常に追加されました!")
except Exception as e:
session.rollback() # エラー発生時にロールバック
print(f"エラーが発生しました: {e}")
finally:
session.close() # セッションを閉じる
途中までは同じですが、今回はデータフレームでなく辞書型データをforで回してrecordに追加しています
前回の内容が分かれば難しくないと思います
・データベースを表示
既にあるデータベースのテーブルのレコードを表示するコードです
from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# データベース接続設定
DATABASE_URL = "sqlite:///example.db" # SQLiteを使用
engine = create_engine(DATABASE_URL, echo=True)
# ベースクラス作成
Base = declarative_base()
# テーブル定義
class ExampleTable(Base):
__tablename__ = 'example_table'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String, nullable=False)
age = Column(Integer, nullable=False)
score = Column(Float, nullable=False)
# テーブル作成
Base.metadata.create_all(engine)
# データベース接続設定(既存のエンジンを使用)
Session = sessionmaker(bind=engine)
session = Session()
# データベースを表示する部分
try:
# テーブルの全データを取得
records = session.query(ExampleTable).all()
# データを表示
print("現在のデータベースの内容:")
for record in records:
print(f"ID: {record.id}, Name: {record.name}, Age: {record.age}, Score: {record.score}")
except Exception as e:
print(f"エラーが発生しました: {e}")
finally:
# セッションを閉じる
session.close()
初めて出てきたコードの部分を解説します
records = session.query(ExampleTable).all()
- session.query(ExampleTable):
ExampleTableクラスに関連付けられたテーブルのデータをクエリします
.
all():
クエリ結果として返されたすべてのレコードをリストとして取得します
ここで.filterを使って検索結果を絞ることもできます
records = session.query(ExampleTable).filter(ExampleTable.age >= 25).all()
- .filter(ExampleTable.age >= 25)
ageの値が25より大きいものだけ、recordsに格納します
for record in records:
print(f”ID: {record.id}, Name: {record.name}, Age: {record.age}, Score: {record.score}”)
レコードをリスト形式で取得できたので、ループで処理しそれぞれのフィールドを出力します
・データベースを削除
データベースからレコードを削除するコードです
from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# データベース接続設定
DATABASE_URL = "sqlite:///example.db" # SQLiteを使用
engine = create_engine(DATABASE_URL, echo=True)
# ベースクラス作成
Base = declarative_base()
# テーブル定義
class ExampleTable(Base):
__tablename__ = 'example_table'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String, nullable=False)
age = Column(Integer, nullable=False)
score = Column(Float, nullable=False)
# テーブル作成
Base.metadata.create_all(engine)
# セッション作成
Session = sessionmaker(bind=engine)
session = Session()
try:
# 条件に一致するレコードを取得
record_to_delete = session.query(ExampleTable).filter(ExampleTable.name == "Alice").first()
# レコードが存在する場合に削除
if record_to_delete:
session.delete(record_to_delete)
session.commit()
print("レコードを削除しました!")
else:
print("削除対象のレコードが見つかりませんでした。")
except Exception as e:
session.rollback()
print(f"エラーが発生しました: {e}")
finally:
session.close()
record_to_delete = session.query(ExampleTable).filter(ExampleTable.name == “Alice”).first()
レコードの指定方法はデータベースを表示する方法とほぼ同じです
今回は.first()をつかって最初にヒットしたレコードのみを指定しています
session.delete(record_to_delete)
.deleteメソッドでレコードを削除します
コメント