Update database references from 'satmachineadmin' to 'satoshimachine': Modified all relevant CRUD operations and migration scripts to reflect the new database name, ensuring consistency across the application.

This commit is contained in:
padreug 2025-06-26 10:14:49 +02:00
parent 4d3e6a4b37
commit 76807663db
2 changed files with 43 additions and 43 deletions

74
crud.py
View file

@ -15,7 +15,7 @@ from .models import (
CreateLamassuTransactionData, StoredLamassuTransaction CreateLamassuTransactionData, StoredLamassuTransaction
) )
db = Database("ext_satmachineadmin") db = Database("ext_satoshimachine")
# DCA Client CRUD Operations # DCA Client CRUD Operations
@ -23,7 +23,7 @@ async def create_dca_client(data: CreateDcaClientData) -> DcaClient:
client_id = urlsafe_short_hash() client_id = urlsafe_short_hash()
await db.execute( await db.execute(
""" """
INSERT INTO satmachineadmin.dca_clients INSERT INTO satoshimachine.dca_clients
(id, user_id, wallet_id, username, dca_mode, fixed_mode_daily_limit, status, created_at, updated_at) (id, user_id, wallet_id, username, dca_mode, fixed_mode_daily_limit, status, created_at, updated_at)
VALUES (:id, :user_id, :wallet_id, :username, :dca_mode, :fixed_mode_daily_limit, :status, :created_at, :updated_at) VALUES (:id, :user_id, :wallet_id, :username, :dca_mode, :fixed_mode_daily_limit, :status, :created_at, :updated_at)
""", """,
@ -44,7 +44,7 @@ async def create_dca_client(data: CreateDcaClientData) -> DcaClient:
async def get_dca_client(client_id: str) -> Optional[DcaClient]: async def get_dca_client(client_id: str) -> Optional[DcaClient]:
return await db.fetchone( return await db.fetchone(
"SELECT * FROM satmachineadmin.dca_clients WHERE id = :id", "SELECT * FROM satoshimachine.dca_clients WHERE id = :id",
{"id": client_id}, {"id": client_id},
DcaClient, DcaClient,
) )
@ -52,14 +52,14 @@ async def get_dca_client(client_id: str) -> Optional[DcaClient]:
async def get_dca_clients() -> List[DcaClient]: async def get_dca_clients() -> List[DcaClient]:
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.dca_clients ORDER BY created_at DESC", "SELECT * FROM satoshimachine.dca_clients ORDER BY created_at DESC",
model=DcaClient, model=DcaClient,
) )
async def get_dca_client_by_user(user_id: str) -> Optional[DcaClient]: async def get_dca_client_by_user(user_id: str) -> Optional[DcaClient]:
return await db.fetchone( return await db.fetchone(
"SELECT * FROM satmachineadmin.dca_clients WHERE user_id = :user_id", "SELECT * FROM satoshimachine.dca_clients WHERE user_id = :user_id",
{"user_id": user_id}, {"user_id": user_id},
DcaClient, DcaClient,
) )
@ -75,7 +75,7 @@ async def update_dca_client(client_id: str, data: UpdateDcaClientData) -> Option
update_data["id"] = client_id update_data["id"] = client_id
await db.execute( await db.execute(
f"UPDATE satmachineadmin.dca_clients SET {set_clause} WHERE id = :id", f"UPDATE satoshimachine.dca_clients SET {set_clause} WHERE id = :id",
update_data update_data
) )
return await get_dca_client(client_id) return await get_dca_client(client_id)
@ -83,7 +83,7 @@ async def update_dca_client(client_id: str, data: UpdateDcaClientData) -> Option
async def delete_dca_client(client_id: str) -> None: async def delete_dca_client(client_id: str) -> None:
await db.execute( await db.execute(
"DELETE FROM satmachineadmin.dca_clients WHERE id = :id", "DELETE FROM satoshimachine.dca_clients WHERE id = :id",
{"id": client_id} {"id": client_id}
) )
@ -93,7 +93,7 @@ async def create_deposit(data: CreateDepositData) -> DcaDeposit:
deposit_id = urlsafe_short_hash() deposit_id = urlsafe_short_hash()
await db.execute( await db.execute(
""" """
INSERT INTO satmachineadmin.dca_deposits INSERT INTO satoshimachine.dca_deposits
(id, client_id, amount, currency, status, notes, created_at) (id, client_id, amount, currency, status, notes, created_at)
VALUES (:id, :client_id, :amount, :currency, :status, :notes, :created_at) VALUES (:id, :client_id, :amount, :currency, :status, :notes, :created_at)
""", """,
@ -112,7 +112,7 @@ async def create_deposit(data: CreateDepositData) -> DcaDeposit:
async def get_deposit(deposit_id: str) -> Optional[DcaDeposit]: async def get_deposit(deposit_id: str) -> Optional[DcaDeposit]:
return await db.fetchone( return await db.fetchone(
"SELECT * FROM satmachineadmin.dca_deposits WHERE id = :id", "SELECT * FROM satoshimachine.dca_deposits WHERE id = :id",
{"id": deposit_id}, {"id": deposit_id},
DcaDeposit, DcaDeposit,
) )
@ -120,7 +120,7 @@ async def get_deposit(deposit_id: str) -> Optional[DcaDeposit]:
async def get_deposits_by_client(client_id: str) -> List[DcaDeposit]: async def get_deposits_by_client(client_id: str) -> List[DcaDeposit]:
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.dca_deposits WHERE client_id = :client_id ORDER BY created_at DESC", "SELECT * FROM satoshimachine.dca_deposits WHERE client_id = :client_id ORDER BY created_at DESC",
{"client_id": client_id}, {"client_id": client_id},
DcaDeposit, DcaDeposit,
) )
@ -128,7 +128,7 @@ async def get_deposits_by_client(client_id: str) -> List[DcaDeposit]:
async def get_all_deposits() -> List[DcaDeposit]: async def get_all_deposits() -> List[DcaDeposit]:
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.dca_deposits ORDER BY created_at DESC", "SELECT * FROM satoshimachine.dca_deposits ORDER BY created_at DESC",
model=DcaDeposit, model=DcaDeposit,
) )
@ -147,7 +147,7 @@ async def update_deposit_status(deposit_id: str, data: UpdateDepositStatusData)
filtered_data["id"] = deposit_id filtered_data["id"] = deposit_id
await db.execute( await db.execute(
f"UPDATE satmachineadmin.dca_deposits SET {set_clause} WHERE id = :id", f"UPDATE satoshimachine.dca_deposits SET {set_clause} WHERE id = :id",
filtered_data filtered_data
) )
return await get_deposit(deposit_id) return await get_deposit(deposit_id)
@ -158,7 +158,7 @@ async def create_dca_payment(data: CreateDcaPaymentData) -> DcaPayment:
payment_id = urlsafe_short_hash() payment_id = urlsafe_short_hash()
await db.execute( await db.execute(
""" """
INSERT INTO satmachineadmin.dca_payments INSERT INTO satoshimachine.dca_payments
(id, client_id, amount_sats, amount_fiat, exchange_rate, transaction_type, (id, client_id, amount_sats, amount_fiat, exchange_rate, transaction_type,
lamassu_transaction_id, payment_hash, status, created_at, transaction_time) lamassu_transaction_id, payment_hash, status, created_at, transaction_time)
VALUES (:id, :client_id, :amount_sats, :amount_fiat, :exchange_rate, :transaction_type, VALUES (:id, :client_id, :amount_sats, :amount_fiat, :exchange_rate, :transaction_type,
@ -183,7 +183,7 @@ async def create_dca_payment(data: CreateDcaPaymentData) -> DcaPayment:
async def get_dca_payment(payment_id: str) -> Optional[DcaPayment]: async def get_dca_payment(payment_id: str) -> Optional[DcaPayment]:
return await db.fetchone( return await db.fetchone(
"SELECT * FROM satmachineadmin.dca_payments WHERE id = :id", "SELECT * FROM satoshimachine.dca_payments WHERE id = :id",
{"id": payment_id}, {"id": payment_id},
DcaPayment, DcaPayment,
) )
@ -191,7 +191,7 @@ async def get_dca_payment(payment_id: str) -> Optional[DcaPayment]:
async def get_payments_by_client(client_id: str) -> List[DcaPayment]: async def get_payments_by_client(client_id: str) -> List[DcaPayment]:
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.dca_payments WHERE client_id = :client_id ORDER BY created_at DESC", "SELECT * FROM satoshimachine.dca_payments WHERE client_id = :client_id ORDER BY created_at DESC",
{"client_id": client_id}, {"client_id": client_id},
DcaPayment, DcaPayment,
) )
@ -199,7 +199,7 @@ async def get_payments_by_client(client_id: str) -> List[DcaPayment]:
async def get_all_payments() -> List[DcaPayment]: async def get_all_payments() -> List[DcaPayment]:
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.dca_payments ORDER BY created_at DESC", "SELECT * FROM satoshimachine.dca_payments ORDER BY created_at DESC",
model=DcaPayment, model=DcaPayment,
) )
@ -207,14 +207,14 @@ async def get_all_payments() -> List[DcaPayment]:
async def update_dca_payment_status(payment_id: str, status: str) -> None: async def update_dca_payment_status(payment_id: str, status: str) -> None:
"""Update the status of a DCA payment""" """Update the status of a DCA payment"""
await db.execute( await db.execute(
"UPDATE satmachineadmin.dca_payments SET status = :status WHERE id = :id", "UPDATE satoshimachine.dca_payments SET status = :status WHERE id = :id",
{"status": status, "id": payment_id} {"status": status, "id": payment_id}
) )
async def get_payments_by_lamassu_transaction(lamassu_transaction_id: str) -> List[DcaPayment]: async def get_payments_by_lamassu_transaction(lamassu_transaction_id: str) -> List[DcaPayment]:
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.dca_payments WHERE lamassu_transaction_id = :transaction_id", "SELECT * FROM satoshimachine.dca_payments WHERE lamassu_transaction_id = :transaction_id",
{"transaction_id": lamassu_transaction_id}, {"transaction_id": lamassu_transaction_id},
DcaPayment, DcaPayment,
) )
@ -226,7 +226,7 @@ async def get_client_balance_summary(client_id: str) -> ClientBalanceSummary:
total_deposits_result = await db.fetchone( total_deposits_result = await db.fetchone(
""" """
SELECT COALESCE(SUM(amount), 0) as total, currency SELECT COALESCE(SUM(amount), 0) as total, currency
FROM satmachineadmin.dca_deposits FROM satoshimachine.dca_deposits
WHERE client_id = :client_id AND status = 'confirmed' WHERE client_id = :client_id AND status = 'confirmed'
GROUP BY currency GROUP BY currency
""", """,
@ -237,7 +237,7 @@ async def get_client_balance_summary(client_id: str) -> ClientBalanceSummary:
total_payments_result = await db.fetchone( total_payments_result = await db.fetchone(
""" """
SELECT COALESCE(SUM(amount_fiat), 0) as total SELECT COALESCE(SUM(amount_fiat), 0) as total
FROM satmachineadmin.dca_payments FROM satoshimachine.dca_payments
WHERE client_id = :client_id AND status = 'confirmed' WHERE client_id = :client_id AND status = 'confirmed'
""", """,
{"client_id": client_id} {"client_id": client_id}
@ -258,14 +258,14 @@ async def get_client_balance_summary(client_id: str) -> ClientBalanceSummary:
async def get_flow_mode_clients() -> List[DcaClient]: async def get_flow_mode_clients() -> List[DcaClient]:
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.dca_clients WHERE dca_mode = 'flow' AND status = 'active'", "SELECT * FROM satoshimachine.dca_clients WHERE dca_mode = 'flow' AND status = 'active'",
model=DcaClient, model=DcaClient,
) )
async def get_fixed_mode_clients() -> List[DcaClient]: async def get_fixed_mode_clients() -> List[DcaClient]:
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.dca_clients WHERE dca_mode = 'fixed' AND status = 'active'", "SELECT * FROM satoshimachine.dca_clients WHERE dca_mode = 'fixed' AND status = 'active'",
model=DcaClient, model=DcaClient,
) )
@ -276,13 +276,13 @@ async def create_lamassu_config(data: CreateLamassuConfigData) -> LamassuConfig:
# Deactivate any existing configs first (only one active config allowed) # Deactivate any existing configs first (only one active config allowed)
await db.execute( await db.execute(
"UPDATE satmachineadmin.lamassu_config SET is_active = false, updated_at = :updated_at", "UPDATE satoshimachine.lamassu_config SET is_active = false, updated_at = :updated_at",
{"updated_at": datetime.now()} {"updated_at": datetime.now()}
) )
await db.execute( await db.execute(
""" """
INSERT INTO satmachineadmin.lamassu_config INSERT INTO satoshimachine.lamassu_config
(id, host, port, database_name, username, password, source_wallet_id, commission_wallet_id, is_active, created_at, updated_at, (id, host, port, database_name, username, password, source_wallet_id, commission_wallet_id, is_active, created_at, updated_at,
use_ssh_tunnel, ssh_host, ssh_port, ssh_username, ssh_password, ssh_private_key) use_ssh_tunnel, ssh_host, ssh_port, ssh_username, ssh_password, ssh_private_key)
VALUES (:id, :host, :port, :database_name, :username, :password, :source_wallet_id, :commission_wallet_id, :is_active, :created_at, :updated_at, VALUES (:id, :host, :port, :database_name, :username, :password, :source_wallet_id, :commission_wallet_id, :is_active, :created_at, :updated_at,
@ -313,7 +313,7 @@ async def create_lamassu_config(data: CreateLamassuConfigData) -> LamassuConfig:
async def get_lamassu_config(config_id: str) -> Optional[LamassuConfig]: async def get_lamassu_config(config_id: str) -> Optional[LamassuConfig]:
return await db.fetchone( return await db.fetchone(
"SELECT * FROM satmachineadmin.lamassu_config WHERE id = :id", "SELECT * FROM satoshimachine.lamassu_config WHERE id = :id",
{"id": config_id}, {"id": config_id},
LamassuConfig, LamassuConfig,
) )
@ -321,14 +321,14 @@ async def get_lamassu_config(config_id: str) -> Optional[LamassuConfig]:
async def get_active_lamassu_config() -> Optional[LamassuConfig]: async def get_active_lamassu_config() -> Optional[LamassuConfig]:
return await db.fetchone( return await db.fetchone(
"SELECT * FROM satmachineadmin.lamassu_config WHERE is_active = true ORDER BY created_at DESC LIMIT 1", "SELECT * FROM satoshimachine.lamassu_config WHERE is_active = true ORDER BY created_at DESC LIMIT 1",
model=LamassuConfig, model=LamassuConfig,
) )
async def get_all_lamassu_configs() -> List[LamassuConfig]: async def get_all_lamassu_configs() -> List[LamassuConfig]:
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.lamassu_config ORDER BY created_at DESC", "SELECT * FROM satoshimachine.lamassu_config ORDER BY created_at DESC",
model=LamassuConfig, model=LamassuConfig,
) )
@ -343,7 +343,7 @@ async def update_lamassu_config(config_id: str, data: UpdateLamassuConfigData) -
update_data["id"] = config_id update_data["id"] = config_id
await db.execute( await db.execute(
f"UPDATE satmachineadmin.lamassu_config SET {set_clause} WHERE id = :id", f"UPDATE satoshimachine.lamassu_config SET {set_clause} WHERE id = :id",
update_data update_data
) )
return await get_lamassu_config(config_id) return await get_lamassu_config(config_id)
@ -353,7 +353,7 @@ async def update_config_test_result(config_id: str, success: bool) -> None:
utc_now = datetime.now(timezone.utc) utc_now = datetime.now(timezone.utc)
await db.execute( await db.execute(
""" """
UPDATE satmachineadmin.lamassu_config UPDATE satoshimachine.lamassu_config
SET test_connection_last = :test_time, test_connection_success = :success, updated_at = :updated_at SET test_connection_last = :test_time, test_connection_success = :success, updated_at = :updated_at
WHERE id = :id WHERE id = :id
""", """,
@ -368,7 +368,7 @@ async def update_config_test_result(config_id: str, success: bool) -> None:
async def delete_lamassu_config(config_id: str) -> None: async def delete_lamassu_config(config_id: str) -> None:
await db.execute( await db.execute(
"DELETE FROM satmachineadmin.lamassu_config WHERE id = :id", "DELETE FROM satoshimachine.lamassu_config WHERE id = :id",
{"id": config_id} {"id": config_id}
) )
@ -378,7 +378,7 @@ async def update_poll_start_time(config_id: str) -> None:
utc_now = datetime.now(timezone.utc) utc_now = datetime.now(timezone.utc)
await db.execute( await db.execute(
""" """
UPDATE satmachineadmin.lamassu_config UPDATE satoshimachine.lamassu_config
SET last_poll_time = :poll_time, updated_at = :updated_at SET last_poll_time = :poll_time, updated_at = :updated_at
WHERE id = :id WHERE id = :id
""", """,
@ -395,7 +395,7 @@ async def update_poll_success_time(config_id: str) -> None:
utc_now = datetime.now(timezone.utc) utc_now = datetime.now(timezone.utc)
await db.execute( await db.execute(
""" """
UPDATE satmachineadmin.lamassu_config UPDATE satoshimachine.lamassu_config
SET last_successful_poll = :poll_time, updated_at = :updated_at SET last_successful_poll = :poll_time, updated_at = :updated_at
WHERE id = :id WHERE id = :id
""", """,
@ -413,7 +413,7 @@ async def create_lamassu_transaction(data: CreateLamassuTransactionData) -> Stor
transaction_id = urlsafe_short_hash() transaction_id = urlsafe_short_hash()
await db.execute( await db.execute(
""" """
INSERT INTO satmachineadmin.lamassu_transactions INSERT INTO satoshimachine.lamassu_transactions
(id, lamassu_transaction_id, fiat_amount, crypto_amount, commission_percentage, (id, lamassu_transaction_id, fiat_amount, crypto_amount, commission_percentage,
discount, effective_commission, commission_amount_sats, base_amount_sats, discount, effective_commission, commission_amount_sats, base_amount_sats,
exchange_rate, crypto_code, fiat_code, device_id, transaction_time, processed_at, exchange_rate, crypto_code, fiat_code, device_id, transaction_time, processed_at,
@ -449,7 +449,7 @@ async def create_lamassu_transaction(data: CreateLamassuTransactionData) -> Stor
async def get_lamassu_transaction(transaction_id: str) -> Optional[StoredLamassuTransaction]: async def get_lamassu_transaction(transaction_id: str) -> Optional[StoredLamassuTransaction]:
"""Get a stored Lamassu transaction by ID""" """Get a stored Lamassu transaction by ID"""
return await db.fetchone( return await db.fetchone(
"SELECT * FROM satmachineadmin.lamassu_transactions WHERE id = :id", "SELECT * FROM satoshimachine.lamassu_transactions WHERE id = :id",
{"id": transaction_id}, {"id": transaction_id},
StoredLamassuTransaction, StoredLamassuTransaction,
) )
@ -458,7 +458,7 @@ async def get_lamassu_transaction(transaction_id: str) -> Optional[StoredLamassu
async def get_lamassu_transaction_by_lamassu_id(lamassu_transaction_id: str) -> Optional[StoredLamassuTransaction]: async def get_lamassu_transaction_by_lamassu_id(lamassu_transaction_id: str) -> Optional[StoredLamassuTransaction]:
"""Get a stored Lamassu transaction by Lamassu transaction ID""" """Get a stored Lamassu transaction by Lamassu transaction ID"""
return await db.fetchone( return await db.fetchone(
"SELECT * FROM satmachineadmin.lamassu_transactions WHERE lamassu_transaction_id = :lamassu_id", "SELECT * FROM satoshimachine.lamassu_transactions WHERE lamassu_transaction_id = :lamassu_id",
{"lamassu_id": lamassu_transaction_id}, {"lamassu_id": lamassu_transaction_id},
StoredLamassuTransaction, StoredLamassuTransaction,
) )
@ -467,7 +467,7 @@ async def get_lamassu_transaction_by_lamassu_id(lamassu_transaction_id: str) ->
async def get_all_lamassu_transactions() -> List[StoredLamassuTransaction]: async def get_all_lamassu_transactions() -> List[StoredLamassuTransaction]:
"""Get all stored Lamassu transactions""" """Get all stored Lamassu transactions"""
return await db.fetchall( return await db.fetchall(
"SELECT * FROM satmachineadmin.lamassu_transactions ORDER BY transaction_time DESC", "SELECT * FROM satoshimachine.lamassu_transactions ORDER BY transaction_time DESC",
model=StoredLamassuTransaction, model=StoredLamassuTransaction,
) )
@ -480,7 +480,7 @@ async def update_lamassu_transaction_distribution_stats(
"""Update distribution statistics for a Lamassu transaction""" """Update distribution statistics for a Lamassu transaction"""
await db.execute( await db.execute(
""" """
UPDATE satmachineadmin.lamassu_transactions UPDATE satoshimachine.lamassu_transactions
SET clients_count = :clients_count, distributions_total_sats = :distributions_total_sats SET clients_count = :clients_count, distributions_total_sats = :distributions_total_sats
WHERE id = :id WHERE id = :id
""", """,

View file

@ -10,7 +10,7 @@ async def m001_initial_dca_schema(db):
# DCA Clients table # DCA Clients table
await db.execute( await db.execute(
f""" f"""
CREATE TABLE satmachineadmin.dca_clients ( CREATE TABLE satoshimachine.dca_clients (
id TEXT PRIMARY KEY NOT NULL, id TEXT PRIMARY KEY NOT NULL,
user_id TEXT NOT NULL, user_id TEXT NOT NULL,
wallet_id TEXT NOT NULL, wallet_id TEXT NOT NULL,
@ -27,7 +27,7 @@ async def m001_initial_dca_schema(db):
# DCA Deposits table # DCA Deposits table
await db.execute( await db.execute(
f""" f"""
CREATE TABLE satmachineadmin.dca_deposits ( CREATE TABLE satoshimachine.dca_deposits (
id TEXT PRIMARY KEY NOT NULL, id TEXT PRIMARY KEY NOT NULL,
client_id TEXT NOT NULL, client_id TEXT NOT NULL,
amount INTEGER NOT NULL, amount INTEGER NOT NULL,
@ -43,7 +43,7 @@ async def m001_initial_dca_schema(db):
# DCA Payments table # DCA Payments table
await db.execute( await db.execute(
f""" f"""
CREATE TABLE satmachineadmin.dca_payments ( CREATE TABLE satoshimachine.dca_payments (
id TEXT PRIMARY KEY NOT NULL, id TEXT PRIMARY KEY NOT NULL,
client_id TEXT NOT NULL, client_id TEXT NOT NULL,
amount_sats INTEGER NOT NULL, amount_sats INTEGER NOT NULL,
@ -61,7 +61,7 @@ async def m001_initial_dca_schema(db):
# Lamassu Configuration table # Lamassu Configuration table
await db.execute( await db.execute(
f""" f"""
CREATE TABLE satmachineadmin.lamassu_config ( CREATE TABLE satoshimachine.lamassu_config (
id TEXT PRIMARY KEY NOT NULL, id TEXT PRIMARY KEY NOT NULL,
host TEXT NOT NULL, host TEXT NOT NULL,
port INTEGER NOT NULL DEFAULT 5432, port INTEGER NOT NULL DEFAULT 5432,
@ -90,7 +90,7 @@ async def m001_initial_dca_schema(db):
# Lamassu Transactions table (for audit trail) # Lamassu Transactions table (for audit trail)
await db.execute( await db.execute(
f""" f"""
CREATE TABLE satmachineadmin.lamassu_transactions ( CREATE TABLE satoshimachine.lamassu_transactions (
id TEXT PRIMARY KEY NOT NULL, id TEXT PRIMARY KEY NOT NULL,
lamassu_transaction_id TEXT NOT NULL UNIQUE, lamassu_transaction_id TEXT NOT NULL UNIQUE,
fiat_amount INTEGER NOT NULL, fiat_amount INTEGER NOT NULL,
@ -119,7 +119,7 @@ async def m002_add_transaction_time_to_dca_payments(db):
""" """
await db.execute( await db.execute(
""" """
ALTER TABLE satmachineadmin.dca_payments ALTER TABLE satoshimachine.dca_payments
ADD COLUMN transaction_time TIMESTAMP ADD COLUMN transaction_time TIMESTAMP
""" """
) )