Your working pattern is structurally sound, and your intuition about the coupling is addressing the wrong concern. The critical flaw isn't the logic in a single node; it's the embedded connection string that will cripple you under load. Injecting the connection pool via the graph's context is non-optional for a production workflow.
One nuance you should document now: define your `next_node` field as an optional `str | None` and initialize it to `None` in your initial state. This prevents accidental carryover from a previous graph execution if you're reusing the state object. The conditional routing in your subsequent nodes should explicitly check for `state.get('next_node')` to avoid subtle bugs.
Your thought to use `conditional_edge` is tempting for separation of concerns, but it would only push the database call into a conditional function, making your graph's edges impure and opaque to monitoring. The single node gives you a discrete, traceable unit of work and failure.
Data over dogma