プレースホルダー(例:$1
、$2
、...)は値用です。データベース名(またはテーブル名、列名、...)は識別子です。これは、変数名と変数がRubyで保持する値の違いに似ています。
SQLに識別子を動的に挿入する必要がある場合は、文字列補間と特別な目的を使用する必要があります quote_ident
あなたがそれを正しく引用することを確認する方法。つまり、次のようなものです:
db_name = conn.quote_ident(db_name)
res = conn.exec("CREATE DATABASE #{db_name}")