Files
mmd/__pycache__/db.cpython-314.pyc

307 lines
21 KiB
Plaintext
Raw Normal View History

2026-05-26 22:21:27 +02:00
+
2026-05-27 22:02:43 +02:00
<00><>jA<00><00><><00>Rt^RIt^RIt^RIHt^RIHt]!4]P!RR4t]!] 4PR, t ]'dRMRt ]'g^RI t ]!R ] 2] PR
7!R R 4tR(R RlltRRltRRltRtRtRtRtRt]R8XEd<>^RI t ]!] P64^8<>d] P6^,MRt]R8Xd
]!4R#]R8Xd]!R4]!4]!4R#]R8XEdC]!4t] R8Xd<>]P<P?4t ] PCR4] PE4Uu.uF q^,NK upt#]$!]#4F;t%] PCR]% 24]!R]% R ] PM4^, R!24K= ] PO4Mn]PCR"4PE4t#]#FIt%]PCR#]%R$, 24PM4R%,t(]!R]%R$, R ]( R!24KK ]PO4]!R&] 24R#]!R'4R#R#uupi))u<>
2026-05-26 22:21:27 +02:00
db.py — Database abstraction layer for MoneyMaker.
Supports both PostgreSQL (production, int.i80.dk) and SQLite (local dev).
Usage:
from db import get_conn, DB_TYPE
conn = get_conn()
rows = conn.execute("SELECT * FROM articles").fetchall()
conn.commit()
conn.close()
Set DATABASE_URL in .env to use PostgreSQL:
DATABASE_URL=postgresql://moneymaker:pass@int.i80.dk:5432/moneymaker
Without DATABASE_URL, falls back to SQLite (ground_news.db).
2026-05-27 22:02:43 +02:00
N)<01>Path)<01> load_dotenv<6E> DATABASE_URL<52>zground_news.db<64>postgres<65>sqliteuC⚠️ WARNING: DATABASE_URL not set — using SQLite fallback at )<01>filec<00><>a<00>]tRt^)toRtV3RlRltV3RlRltRV3RlRlltV3R lR
2026-05-26 22:21:27 +02:00
ltV3R lR lt R t
Rt Rt Rt RtRtVtR#)<14>DBConnu
Unified connection wrapper for SQLite and PostgreSQL.
- execute(sql, params): normalises ? → %s for Postgres; returns dict-row cursor
- upsert(table, pk, cols, vals): cross-DB INSERT OR REPLACE / ON CONFLICT DO UPDATE
- commit() / rollback() / close()
2026-05-27 22:02:43 +02:00
c<00> <<01>V^8<>dQhRS[/#)<02><00>db_type<70><01>str)<02>format<61> __classdict__s"<22><>%/home/hjess/Projects/MoneyMaker/db.py<70> __annotate__<5F>DBConn.__annotate__2s<00><><00><1F><1F>c<EFBFBD><1F>c<08><00>WnW nR#<00>N<><02>_connr )<03>self<6C>connr s&&&r<00>__init__<5F>DBConn.__init__2s <00><00><1B>
<EFBFBD><1E> rc<00>&<<01>V^8<>dQhRS[RS[/#)r <00>sql<71>returnr)rrs"<22>rrr6s<00><><00><13><13><03><13><03>rc <0C>L<00>VPR8XdVPRR4#V#)z,Translate ? placeholders to %s for Postgres.r<00>?<3F>%s)r <00>replace)rrs&&r<00>_sql<71> DBConn._sql6s$<00><00> <0F><<3C><<3C>:<3A> %<25><16>;<3B>;<3B>s<EFBFBD>D<EFBFBD>)<29> )<29><12>
rNc<00> <<01>V^8<>dQhRS[/#<00>r rr)rrs"<22>rrr<s<00><><00> 3<> 3<>3<EFBFBD> 3rc<08>v<00>VPV4pVPR8Xd_^RIpVPP VP
P R7pVfVPV4V#VPW4V#VfVPPV4#VPPW4#)rN)<01>cursor_factory)r%r <00>psycopg2.extrasr<00>cursor<6F>extras<61>RealDictCursor<6F>execute)rr<00>params<6D>psycopg2<67>curs&&& rr/<00>DBConn.execute<s<><00><00><12>i<EFBFBD>i<EFBFBD><03>n<EFBFBD><03> <0F><<3C><<3C>:<3A> %<25> "<22><16>*<2A>*<2A>#<23>#<23>8<EFBFBD>?<3F>?<3F>3Q<33>3Q<33>#<23>R<>C<EFBFBD><15>~<7E><13> <0B> <0B>C<EFBFBD> <20><17>J<EFBFBD><14> <0B> <0B>C<EFBFBD>(<28><16>J<EFBFBD><15>~<7E><1B>z<EFBFBD>z<EFBFBD>)<29>)<29>#<23>.<2E>.<2E><17>:<3A>:<3A>%<25>%<25>c<EFBFBD>2<> 2rc<00> <<01>V^8<>dQhRS[/#r(r)rrs"<22>rrrKs<00><><00>-<2D>-<2D>s<EFBFBD>-rc<08><><00>VPV4pVPR8Xd.VPP4pVP W4R#VPP W4R#)rN)r%r rr,<00> executemany)rr<00>seqr2s&&& rr6<00>DBConn.executemanyKsK<00><00><12>i<EFBFBD>i<EFBFBD><03>n<EFBFBD><03> <0F><<3C><<3C>:<3A> %<25><16>*<2A>*<2A>#<23>#<23>%<25>C<EFBFBD> <0F>O<EFBFBD>O<EFBFBD>C<EFBFBD> %<25> <10>J<EFBFBD>J<EFBFBD> "<22> "<22>3<EFBFBD> ,rc<00>,<<01>V^8<>dQhRS[RS[RS[/#)r <00>table<6C>cols<6C>vals)r<00>list<73>tuple)rrs"<22>rrrSs"<00><><00>"<0E>"<0E>C<EFBFBD>"<0E>4<EFBFBD>"<0E>u<EFBFBD>"rc
2026-05-26 22:21:27 +02:00
 <0C><><00>\V\4'dV.pVPR8Xd<>RPV4pRPR.\ V4,4pVUu.uF qwV9gK VNK ppRPV4p V'd+RPRV44p
RV RV RV RV R V
2
p MRV RV RV RV R
2 p VP
P 4p V PW<>4R#RPV4pRPR .\ V4,4pVP
PR V RV RV R 2V4R#uupi)z<>
Cross-DB upsert.
pk: single column name (str) or list of column names for composite PK.
SQLite: INSERT OR REPLACE INTO table (cols) VALUES (?,...)
Postgres: INSERT INTO table (cols) VALUES (%s,...) ON CONFLICT (pk) DO UPDATE SET ...
2026-05-27 22:02:43 +02:00
r<00>, r#c3<00>."<00>TF q RV 2x<00>K R#5i)z
=EXCLUDED.N<>)<02>.0<EFBFBD>cs& r<00> <genexpr><3E> DBConn.upsert.<locals>.<genexpr>cs<00><00><00>"G<><06>1<EFBFBD>S<EFBFBD>
2026-05-26 22:21:27 +02:00
<EFBFBD>1<EFBFBD>#<23>#6<><06>s<00><01> INSERT INTO <20> (<28>
2026-05-27 22:02:43 +02:00
) VALUES (z) ON CONFLICT (z) DO UPDATE SET z ) DO NOTHINGr"zINSERT OR REPLACE INTO <20>)N)<08>
isinstancerr <00>join<69>lenrr,r/) rr:<00>pkr;r<<00>col_sql<71>val_sqlrD<00>non_pk<70>pk_sql<71>updaterr2s &&&&& r<00>upsert<72> DBConn.upsertSs\<00><00> <16>b<EFBFBD>#<23> <1E> <1E><14><14>B<EFBFBD> <0F><<3C><<3C>:<3A> %<25><1A>i<EFBFBD>i<EFBFBD><04>o<EFBFBD>G<EFBFBD><1A>i<EFBFBD>i<EFBFBD><14><06><13>T<EFBFBD><19> 2<>3<>G<EFBFBD>"&<26>6<>$<24>Q<EFBFBD>2<EFBFBD>+<2B>q<EFBFBD>q<EFBFBD>$<24>F<EFBFBD>6<><1A>i<EFBFBD>i<EFBFBD><02>m<EFBFBD>F<EFBFBD><15><1D><19><19>"G<><06>"G<>G<><06>"<22>5<EFBFBD>'<27><12>G<EFBFBD>9<EFBFBD>J<EFBFBD>w<EFBFBD>i<EFBFBD>H$<24>$*<2A>8<EFBFBD>+;<3B>F<EFBFBD>8<EFBFBD>E<01><14> #<23>5<EFBFBD>'<27><12>G<EFBFBD>9<EFBFBD>J<EFBFBD>w<EFBFBD>i<EFBFBD>H$<24>$*<2A>8<EFBFBD><<3C>9<><14><17>*<2A>*<2A>#<23>#<23>%<25>C<EFBFBD> <0F>K<EFBFBD>K<EFBFBD><03> "<22><1A>i<EFBFBD>i<EFBFBD><04>o<EFBFBD>G<EFBFBD><1A>i<EFBFBD>i<EFBFBD><13><05><03>D<EFBFBD> <09> 1<>2<>G<EFBFBD> <10>J<EFBFBD>J<EFBFBD> <1E> <1E>)<29>%<25><17><02>7<EFBFBD>)<29>:<3A>g<EFBFBD>Y<EFBFBD>a<EFBFBD>P<><14> <0E><>%7s <00>"E<04>/Ec<08>:<00>VPP4R#r)r<00>commit<69>rs&rrW<00> DBConn.commitws<00><00> <0C>
2026-05-26 22:21:27 +02:00
<EFBFBD>
2026-05-27 22:02:43 +02:00
<EFBFBD><19><19>rc<08>:<00>VPP4R#r)r<00>rollbackrXs&rr[<00>DBConn.rollbackzs<00><00> <0C>
2026-05-26 22:21:27 +02:00
<EFBFBD>
2026-05-27 22:02:43 +02:00
<EFBFBD><1B><1B>rc<08>:<00>VPP4R#r)r<00>closerXs&rr^<00> DBConn.close}s<00><00> <0C>
2026-05-26 22:21:27 +02:00
<EFBFBD>
2026-05-27 22:02:43 +02:00
<EFBFBD><18><18>rc<08><00>V#rrBrXs&r<00> __enter__<5F>DBConn.__enter__<5F>s<00><00><13> rc<08>x<00>V'dVP4MVP4VP4R#r)r[rWr^)r<00>exc_type<70>_s&&*r<00>__exit__<5F>DBConn.__exit__<5F>s <00><00> <13> <10>M<EFBFBD>M<EFBFBD>O<EFBFBD> <10>K<EFBFBD>K<EFBFBD>M<EFBFBD> <0C>
2026-05-26 22:21:27 +02:00
<EFBFBD>
2026-05-27 22:02:43 +02:00
<EFBFBD> rrr)<11>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__<5F>__doc__rr%r/r6rTrWr[r^rarf<00>__static_attributes__<5F>__classdictcell__)rs@rr
r
)s[<00><><00><00><08><1F><1F><13><13> 3<> 3<>-<2D>-<2D>"<0E>"<0E>H<1C><1E><1B><14><15>rr
c<00>0<00>V^8<>dQhR\R\/#<00>r <00>nr <00><02>intr)rs"rrr<00>s<00><00>2<>2<>#<23>2<>c<EFBFBD>2rc<04> <00>\R8XdR#R#)z8Return query placeholder: %s for postgres, ? for sqlite.rr#r")<01>DB_TYPE)rqs&r<00>phrv<00>s<00><00><1A>j<EFBFBD>(<28>4<EFBFBD>1<>c<EFBFBD>1rc<00>0<00>V^8<>dQhR\R\/#rprr)rs"rrr<00>s<00><00><1E><1E>C<EFBFBD><1E>C<EFBFBD>rc<04>H<00>\4pRPV.V,4#)z1Return comma-separated placeholders for n values.r@)rvrL)rq<00>ps& r<00> placeholdersrz<00>s<00><00>
<EFBFBD><04>A<EFBFBD> <0F>9<EFBFBD>9<EFBFBD>a<EFBFBD>S<EFBFBD>1<EFBFBD>W<EFBFBD> <1D>rc<00>$<00>V^8<>dQhR\/#)r r )r
)rs"rrr<00>s<00><00>
2026-05-26 22:21:27 +02:00
&<26>
&<26>&<26>
2026-05-27 22:02:43 +02:00
&rc<04><><00>\R8Xd-^RIpVP\4pRVn\ VR4#\ P!\\44p\ PVn
\ VR4#)z-Return a DBConn wrapper (Postgres or SQLite).rNFr) rur1<00>connectr<00>
autocommitr
<00>sqlite3r<00> SQLITE_PATH<54>Row<6F> row_factory)r1rs r<00>get_connr<6E><00>s]<00><00><0E>*<2A><1C><17><17><1F><1F> <0C>-<2D><04><1F><04><0F><15>d<EFBFBD>J<EFBFBD>'<27>'<27><16><EFBFBD><EFBFBD>s<EFBFBD>;<3B>/<2F>0<><04>"<22>;<3B>;<3B><04><18><15>d<EFBFBD>H<EFBFBD>%<25>%ra<>
2026-05-26 22:21:27 +02:00
CREATE TABLE IF NOT EXISTS page_cache (
url TEXT PRIMARY KEY,
page_type TEXT NOT NULL,
fetched_at INTEGER NOT NULL,
content TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS rss_feed_cache (
feed_id TEXT PRIMARY KEY,
fetched_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS articles (
slug TEXT PRIMARY KEY,
story_id TEXT,
title TEXT NOT NULL,
description TEXT,
start_date TEXT,
source_count INTEGER,
bias_src_count INTEGER,
left_pct REAL,
ctr_pct REAL,
right_pct REAL,
left_src_count INTEGER,
ctr_src_count INTEGER,
right_src_count INTEGER,
overall_bias REAL,
blindspot TEXT,
factuality_json TEXT,
interests_json TEXT,
categories TEXT,
first_seen INTEGER,
last_seen INTEGER
);
CREATE TABLE IF NOT EXISTS article_signals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
article_slug TEXT NOT NULL,
ticker TEXT NOT NULL,
company_name TEXT NOT NULL,
sector TEXT,
sentiment TEXT,
sentiment_score REAL,
entity_score REAL,
mention_count INTEGER,
full_text_used INTEGER,
analyzed_at INTEGER NOT NULL,
coverage_spread REAL,
claude_tickers TEXT,
claude_magnitude INTEGER,
claude_timeframe TEXT,
claude_reasoning TEXT,
momentum_dir TEXT,
momentum_pct_5d REAL,
signal_score REAL,
alert INTEGER
);
CREATE TABLE IF NOT EXISTS positions (
ticker TEXT PRIMARY KEY,
shares REAL NOT NULL,
entry_price REAL NOT NULL,
entry_date TEXT NOT NULL,
stop_loss REAL NOT NULL,
take_profit REAL NOT NULL,
note TEXT
);
CREATE TABLE IF NOT EXISTS position_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticker TEXT NOT NULL,
action TEXT NOT NULL,
shares REAL NOT NULL,
price REAL NOT NULL,
total_dkk REAL NOT NULL,
fee_dkk REAL,
pnl_dkk REAL,
signal_correct INTEGER,
event_date TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS saxo_orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticker TEXT NOT NULL,
direction TEXT NOT NULL,
shares REAL NOT NULL,
price_dkk REAL,
total_dkk REAL,
fee_dkk REAL,
saxo_order_id TEXT,
status TEXT NOT NULL,
signal_score REAL,
analyst_rec TEXT,
placed_at TEXT NOT NULL,
filled_at TEXT,
note TEXT
);
a<EFBFBD>
CREATE TABLE IF NOT EXISTS page_cache (
url TEXT PRIMARY KEY,
page_type TEXT NOT NULL,
fetched_at BIGINT NOT NULL,
content TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS rss_feed_cache (
feed_id TEXT PRIMARY KEY,
fetched_at BIGINT NOT NULL
);
CREATE TABLE IF NOT EXISTS articles (
slug TEXT PRIMARY KEY,
story_id TEXT,
title TEXT NOT NULL,
description TEXT,
start_date TEXT,
source_count INTEGER,
bias_src_count INTEGER,
left_pct REAL,
ctr_pct REAL,
right_pct REAL,
left_src_count INTEGER,
ctr_src_count INTEGER,
right_src_count INTEGER,
overall_bias REAL,
blindspot TEXT,
factuality_json TEXT,
interests_json TEXT,
categories TEXT,
first_seen BIGINT,
last_seen BIGINT
);
CREATE TABLE IF NOT EXISTS article_signals (
id SERIAL PRIMARY KEY,
article_slug TEXT NOT NULL,
ticker TEXT NOT NULL,
company_name TEXT NOT NULL,
sector TEXT,
sentiment TEXT,
sentiment_score REAL,
entity_score REAL,
mention_count INTEGER,
full_text_used INTEGER,
analyzed_at BIGINT NOT NULL,
coverage_spread REAL,
claude_tickers TEXT,
claude_magnitude INTEGER,
claude_timeframe TEXT,
claude_reasoning TEXT,
momentum_dir TEXT,
momentum_pct_5d REAL,
signal_score REAL,
alert INTEGER,
UNIQUE(article_slug, ticker)
);
CREATE TABLE IF NOT EXISTS positions (
ticker TEXT PRIMARY KEY,
shares REAL NOT NULL,
entry_price REAL NOT NULL,
entry_date TEXT NOT NULL,
stop_loss REAL NOT NULL,
take_profit REAL NOT NULL,
note TEXT
);
CREATE TABLE IF NOT EXISTS position_events (
id SERIAL PRIMARY KEY,
ticker TEXT NOT NULL,
action TEXT NOT NULL,
shares REAL NOT NULL,
price REAL NOT NULL,
total_dkk REAL NOT NULL,
fee_dkk REAL,
pnl_dkk REAL,
signal_correct SMALLINT,
event_date TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS saxo_orders (
id SERIAL PRIMARY KEY,
ticker TEXT NOT NULL,
direction TEXT NOT NULL,
shares REAL NOT NULL,
price_dkk REAL,
total_dkk REAL,
fee_dkk REAL,
saxo_order_id TEXT,
status TEXT NOT NULL,
signal_score REAL,
analyst_rec TEXT,
placed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
filled_at TIMESTAMPTZ,
note TEXT
);
2026-05-27 22:02:43 +02:00
c<04><><00>\R8Xd<>^RIpVP\4pVP 4p\
P R4F.pVP4pV'gKVPV4K0 VPR4VP4'gVPR4VP4VP4VP4Mc\P!\\44pVP\ 4\#V4VP4VP4\%R\ R24R#)zBCreate all tables if they don't exist. Safe to run multiple times.rN<>;z<>
2026-05-26 22:21:27 +02:00
SELECT 1 FROM pg_constraint
WHERE conname = 'uq_article_ticker'
AND conrelid = 'article_signals'::regclass
2026-05-27 22:02:43 +02:00
zZALTER TABLE article_signals ADD CONSTRAINT uq_article_ticker UNIQUE (article_slug, ticker)z Schema initialiseret (rJ)rur1r}rr,<00>SCHEMA_POSTGRES<45>split<69>stripr/<00>fetchonerWr^rrr<><00> executescript<70> SCHEMA_SQLITE<54>_migrate_sqlite_columns<6E>print)r1rr2<00>stmts r<00> init_schemar<61>ss<><00><00><0E>*<2A><1C><17><17><1F><1F> <0C>-<2D><04><13>{<7B>{<7B>}<7D><03>#<23>)<29>)<29>#<23>.<2E>D<EFBFBD><17>:<3A>:<3A><<3C>D<EFBFBD><13>t<EFBFBD><13> <0B> <0B>D<EFBFBD>!<21>/<2F>
2026-05-26 22:21:27 +02:00
<0C> <0B> <0B> <0C> <0A>
<13>|<7C>|<7C>~<7E>~<7E> <0F>K<EFBFBD>K<EFBFBD>Q<01> <0E> <0A> <0B> <0B> <0A> <0B> <09> <09> <0B> <0C>
<EFBFBD>
2026-05-27 22:02:43 +02:00
<EFBFBD> <0C><16><EFBFBD><EFBFBD>s<EFBFBD>;<3B>/<2F>0<><04> <0C><1A><1A>=<3D>)<29><1F><04>%<25> <0C> <0B> <0B> <0A> <0C>
2026-05-26 22:21:27 +02:00
<EFBFBD>
<EFBFBD> <0C> <09> $<24>W<EFBFBD>I<EFBFBD>Q<EFBFBD>
2026-05-27 22:02:43 +02:00
/<2F>0rc <04>.<00>RR R.R.RO/pVP4Fqwr#VPRV R24Uu0uF qD^,kK ppVF<wrgWe9gK VPRV RV RV 24\RV R V R
V R 24K> Ks R #uupi)zGAdd any missing columns to existing SQLite tables (forward migrations).<2E>position_events<74> positionszPRAGMA table_info(rJz ALTER TABLE z ADD COLUMN <20> z SQLite migration: <20>.rHz) addedN)<02>signal_correct<63>INTEGER)<02>pnl_dkk<6B>REAL))<02> stop_lossr<73>)<02> take_profitr<74>)<02> analyst_rec<65>TEXT)<02>noter<65>)<03>itemsr/r<>)r<00>
migrationsr:r;<00>row<6F>existing<6E>col<6F>col_types& rr<>r<><00>s<><00><00> <1A> )<29> &<26>
<EFBFBD> <14>
<EFBFBD> <06>J<EFBFBD>"<22>'<27>'<27>)<29> <0B><05>&*<2A>l<EFBFBD>l<EFBFBD>5G<35><05>w<EFBFBD>a<EFBFBD>3P<33>&Q<>R<>&Q<>s<EFBFBD><01>F<EFBFBD>F<EFBFBD>&Q<><08>R<>!<21>M<EFBFBD>C<EFBFBD><12>"<22><14> <0C> <0C>|<7C>E<EFBFBD>7<EFBFBD>,<2C>s<EFBFBD>e<EFBFBD>1<EFBFBD>X<EFBFBD>J<EFBFBD>O<>P<><15>,<2C>U<EFBFBD>G<EFBFBD>1<EFBFBD>S<EFBFBD>E<EFBFBD><12>H<EFBFBD>:<3A>W<EFBFBD>M<>N<>"<22>*<2A><>Rs<00>Bc <04>P<00>\R8wd\R4R#^RIp\P!\ \ 44p\PVn\4pVP4p.ROpVEF<>pVPRV 24P4pV'g\RV R24K?\V^,P44pRPV4pRPR.\!V4,4p R V9dVU
2026-05-26 22:21:27 +02:00
u.uF q<>R 8wgK V
NK up
MTp RPR.\!V 4,4p RPV 4p ^p^pVF<>p.pV FWp
VV
,p\#V\$\&34'd^RIpVP+R
V4^,pVP/V4KY \1V4pVPR V R V R V R2V4VP2^8<>d V^, pK<>V^, pK<> VP54\RV RV RV R24EK<> VP74VP74\R4R#uup
i \,dRpL<>i;i \,dpT^, pRp?EK=Rp?ii;i)z<>
One-time migration: copy all data from local SQLite to Postgres.
Safe to run multiple times (uses INSERT OR IGNORE / ON CONFLICT DO NOTHING).
2026-05-27 22:02:43 +02:00
ru/DATABASE_URL ikke sat — kører ikke migrationNzSELECT * FROM <20> u: 0 rækker — skipr@r#<00>id<69>drGrHrIz) ON CONFLICT DO NOTHING<4E>: z indsat, z sprunget overu Migration færdig!)<06>
page_cache<EFBFBD>rss_feed_cache<68>articles<65>article_signalsr<73>r<>)rur<>r1rr}rr<>r<>r<>r<>r,r/<00>fetchallr=<00>keysrLrMrK<00>bytes<65> bytearray<61>struct<63>unpack<63> Exception<6F>appendr><00>rowcountrWr^)r1<00> sqlite_conn<6E>pg_conn<6E>pg_cur<75>tablesr:<00>rowsr;<00>cols_sql<71>vals_sqlrD<00> insert_cols<6C> insert_vals<6C>insert_cols_sql<71>inserted<65>skippedr<64><00>values<65>vr<76><00>es r<00>migrate_sqlite_to_postgresr<73><00>sf<00><00>
2026-05-26 22:21:27 +02:00
<0F>*<2A><1C> <0A>?<3F>@<40><0E><13><19>/<2F>/<2F>#<23>k<EFBFBD>"2<>3<>K<EFBFBD>%<25>k<EFBFBD>k<EFBFBD>K<EFBFBD><1B><1A>*<2A>G<EFBFBD><19>.<2E>.<2E>"<22>F<EFBFBD><06>F<EFBFBD>
<18><05><1A>"<22>"<22>^<5E>E<EFBFBD>7<EFBFBD>#;<3B><<3C>E<>E<>G<><04><13> <11>B<EFBFBD>u<EFBFBD>g<EFBFBD>1<>2<> 3<> <14><13>D<EFBFBD><11>G<EFBFBD>L<EFBFBD>L<EFBFBD>N<EFBFBD>#<23><04><17>9<EFBFBD>9<EFBFBD>T<EFBFBD>?<3F><08><17>9<EFBFBD>9<EFBFBD>d<EFBFBD>V<EFBFBD>c<EFBFBD>$<24>i<EFBFBD>/<2F>0<><08>9=<3D><04> <0C>$<24>4<>$<24>Q<EFBFBD>t<EFBFBD>)<29>q<EFBFBD>q<EFBFBD>$<24>4<>$<24> <0B><1A>i<EFBFBD>i<EFBFBD><14><06><13>[<5B>)9<> 9<>:<3A> <0B><1E>)<29>)<29>K<EFBFBD>0<><0F><14><08><14><07><17>C<EFBFBD><17>F<EFBFBD> <20><01><17><01>F<EFBFBD><01><1D>a<EFBFBD>%<25><19>!3<>4<>4<>!<21>%<25>"<22>M<EFBFBD>M<EFBFBD>#<23>q<EFBFBD>1<>!<21>4<><01><17> <0A> <0A>a<EFBFBD> <20>!<21><1B>6<EFBFBD>]<5D>F<EFBFBD> <1D><16><0E><0E>"<22>5<EFBFBD>'<27><12>O<EFBFBD>+<<3C>J<EFBFBD>{<7B>m<EFBFBD>T-<2D>.<2E><1A><12>
<1A>?<3F>?<3F>Q<EFBFBD>&<26><1C><01>M<EFBFBD>H<EFBFBD><1B>q<EFBFBD>L<EFBFBD>G<EFBFBD>-<18>4 <10><0E><0E><18> <0A><02>5<EFBFBD>'<27><12>H<EFBFBD>:<3A>Y<EFBFBD>w<EFBFBD>i<EFBFBD>~<7E>F<>G<>Y<18>\<10><15><15><17> <0B>M<EFBFBD>M<EFBFBD>O<EFBFBD> <09>
2026-05-27 22:02:43 +02:00
<20>!<21><>K5<><35>%<25>!<21> <20><01>!<21><><1D> <1D><17>1<EFBFBD> <0C><07><> <1D>s<<00>I-<06>I-<06>I2<06>6J<04> J<04>2 J <09>J <09> J%<07> J <07> J%<07>__main__<5F>status<75>init<69>migrateu"Migrerer SQLite → PostgreSQL ...z9SELECT tablename FROM pg_tables WHERE schemaname='public'zSELECT COUNT(*) FROM r<>r<>u rækkerz1SELECT name FROM sqlite_master WHERE type='table'zSELECT COUNT(*) AS cnt FROM <20>name<6D>cntz
DB type: z(Brug: python db.py [init|migrate|status])<01>))rl<00>osr<00>pathlibr<00>dotenvr<00>getenvr<00>__file__<5F>parentr<74>ru<00>sysr<73><00>stderrr
rvrzr<>r<>r<>r<>r<>r<>rhrM<00>argv<67>cmdrrr,<00>rawr/r<>r<><00>sorted<65>tr<74>r^rq)<01>rs0r<00><module>r<>s7<00><01><04>$
<EFBFBD><0E><18><1E> <0B> <0A><11>y<EFBFBD>y<EFBFBD><1E><12>,<2C> <0C><13>H<EFBFBD>~<7E>$<24>$<24>'7<>7<> <0B>)<29>z<EFBFBD>x<EFBFBD><07><13><0E> <09>M<> <16>-<2D> <19> <10>Z<EFBFBD>Z<EFBFBD><06>_<15>_<15>H2<>
2026-05-26 22:21:27 +02:00
<1E>
2026-05-27 22:02:43 +02:00
&<26>b<04> <0A>Hc<04><0F>L1<>BO<01>0D"<22>N <0C>z<EFBFBD><19><0E><1C>S<EFBFBD>X<EFBFBD>X<EFBFBD><1D><11>*<2A>#<23>(<28>(<28>1<EFBFBD>+<2B><08>C<EFBFBD>
2026-05-26 22:21:27 +02:00
<EFBFBD>f<EFBFBD>}<7D><13> <0A> <0C> <09> <19> <0A>2<>4<><13> <0A>"<22>$<24> <0C><08><1F><17>z<EFBFBD><04> <12>j<EFBFBD> <20><16>*<2A>*<2A>#<23>#<23>%<25>C<EFBFBD> <0F>K<EFBFBD>K<EFBFBD>S<> T<>$'<27>L<EFBFBD>L<EFBFBD>N<EFBFBD>3<>N<EFBFBD>q<EFBFBD><01>d<EFBFBD>d<EFBFBD>N<EFBFBD>3<>F<EFBFBD><1B>F<EFBFBD>^<5E><01><13> <0B> <0B>3<>A<EFBFBD>3<EFBFBD>7<>8<><15><02>1<EFBFBD>#<23>R<EFBFBD><03> <0C> <0C><0E>q<EFBFBD> 1<>2<>(<28>;<3B><<3C>$<24> <10>I<EFBFBD>I<EFBFBD>K<EFBFBD><19>\<5C>\<5C>"U<>V<>_<>_<>a<>F<EFBFBD><1B><01><18>L<EFBFBD>L<EFBFBD>#?<3F><01>&<26> <09>{<7B>!K<>L<>U<>U<>W<>X]<5D>^<5E><01><15><02>1<EFBFBD>V<EFBFBD>9<EFBFBD>+<2B>R<EFBFBD><01>s<EFBFBD>(<28>3<>4<><1C> <0A>
<EFBFBD>
2026-05-27 22:02:43 +02:00
<EFBFBD> <0C> <0A> <0A>g<EFBFBD>Y<EFBFBD>'<27>(<28> <0A>8<>9<>9<1A><>4s<00>I!