私Ubuntu 22.04
はPython 3.10
.
私はこれらの適切なパッケージを使用します:
mysql-client
libmysqlclient-dev
次の Python パッケージを使用します。
import mysqlclient==2.1.0
import sqlalchemy
# for the environment variables:
from dotenv import load_dotenv
# And to use sessions with flush, with the commit only at the end:
from sqlalchemy.orm import sessionmaker
sessionmaker
パラメータautoflush
はTrueに設定されています。
削除を追加し、その後 sqlalchemy.orm セッションに挿入して、2 つのコマンドがうまくいった場合にのみコミットするようにしたいと考えています。これの目的は、1 日に更新されるテーブルを更新することです。挿入が実際に機能するかどうか確信が持てないうちに、何も削除したくありません。
このエラーにつながる Python コードの部分 (フォローアップ挿入コマンドなし):
DELETE_QUERY = f"""
DELETE FROM {MY_TABLE}
WHERE checkdate = DATE(NOW())
"""
def delete_execute(sess, conn, query):
"""Function for deleting and adding to sess values
from the DB
:param connection: pymsql connection to DB
:param query: SQL query containing DELETE keyword
:return: count of rows deleted
"""
try:
cursor = conn.cursor()
sess.add(cursor.execute(query))
# # Not yet commit, only after insertion:
# connection.commit()
# # Updates the objects of the session:
# sess.flush()
# # Not needed here since autoflush is set to True
return cursor.rowcount, sess
engine = create_engine(CONNECTION)
# Session = sessionmaker(engine)
Session = sessionmaker(autocommit=False, autoflush=True, bind=engine)
# Connect to DB
logging.info("Connecting to DB ...")
# # with statement closes the connection automatically,
# # see https://docs.sqlalchemy.org/en/14/dialects/mysql.html
# # But the class does not have the needed __enter__ attribute
# https://stackoverflow.com/questions/51427729/python-error-attributeerror-enter
# with engine.connect() as conn:
# # engine.connect() throws an error as well:
# conn = engine.connect()
# # connection.cursor() AttributeError: 'Connection' object has no attribute 'cursor'
# https://stackoverflow.com/questions/38332787/pandas-to-sql-to-sqlite-returns-engine-object-has-no-attribute-cursor
conn = engine.raw_connection()
with Session() as sess:
# The records only get deleted after commit
# This only adds them to the session.
deleted_records_count, sess = delete_execute(sess, conn, DELETE_QUERY)
同じエラーに関する他のリンクからの手がかりが得られません:
ユーザー モデルには多くのタスク モデルが含まれ、タスク モデルには多くのサブタスク モデルが含まれます。
...SQLAlchemy と Marshmallow を使用して新しいユーザーを DB に挿入します。
私は sqlalchemy.orm を初めて使用し、何か誤解しているのではないかと心配しています。レコードの削除とその後の挿入にセッションを使用したいのですが、2 つのコマンドの最後にのみコミットしたいと考えています。削除にはカーソルを使用します。次の挿入タスクも機能する場合にのみタスクが実行されるように、conn
オブジェクトからのみ使用できるカーソルを埋め込むにはどうすればよいですか? conn = engine.raw_connection()
セッションに追加することはできません:
sess.add(cursor.execute(query))
スローするもの:
sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.int' is not mapped
エラーの詳細:
Traceback (most recent call last):
File "/usr/lib/python3.9/runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.9/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/MY_PROJECT/main.py", line 574, in <module>
get_sql_and_save_as_csv_in_gcs(request)
File "/MY_PROJECT/main.py", line 489, in get_sql_and_save_as_csv_in_gcs
deleted_records_count, sess = delete_execute(sess, conn, DELETE_QUERY)
File "/usr/local/lib/python3.9/dist-packages/dryable/__init__.py", line 34, in _decorated
return function( * args, ** kwargs )
File "/MY_PROJECT/main.py", line 204, in delete_execute
sess.add(cursor.execute(query))
File "/usr/local/lib/python3.9/dist-packages/sqlalchemy/orm/session.py", line 2601, in add
util.raise_(
File "/usr/local/lib/python3.9/dist-packages/sqlalchemy/util/compat.py", line 207, in raise_
raise exception
sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.int' is not mapped
では、どうすればいいですか?