Используя и следуя документации: https://godoc.org/github.com/lib/pq но не могу видеть в нерабочее время и поищите в Интернете хороший пример передачи переменных в db.Exec () Я создаю программу, которая будет создавать новые таблицы в зависимости от определенных имен, введенных в аргументы команды.
db.Exec(`CREATE TABLE $1(
ID INT PRIMARY KEY NOT NULL,
HOST TEXT NOT NULL,
PORTS TEXT,
BANNERS TEXT,
JAVASCRIPT TEXT,
HEADERS TEXT,
COMMENTS TEXT,
ROBOTS TEXT,
EMAILS TEXT,
CMS TEXT,
URLS TEXT,
BUSTIN TEXT,
VULN TEXT
)`, tablename)
Но не повезло, я, очевидно, попытался все изменить, даже я попытался создать синтаксис CREATE TABLE для строки и попытаться передать это вместо db.Exec (string) но и не повезло ... может кто-нибудь протянуть мне руку?
Спасибо
да, как в этом примере: panic: pq: синтаксическая ошибка на уровне «$ 1» или около него, но, конечно, когда я меняю его, я получаю другие ошибки.
Я не знаю GO, но я знаю, что на большинстве других языков нельзя параметризовать идентификаторы объектов, только значения. Вам нужно объединить имя таблицы в строку, которую вы передаете методу Exec()
.
ох @a_horse_with_no_name, что сработало! но .... из точки безопасности. Разве теперь не будет легко просто ввести код SQL?
С точки зрения безопасности код приложения не должен изначально создавать таблицы. Не говоря уже о таблицах, в которых пользователь указывает имя.
хорошо, если программа этого не сделает, у пользователя все еще есть доступ к PostgreSQL, чтобы сделать это вручную, так что то же самое. у него есть полные права доступа к своей базе данных. поэтому я предполагаю, что в этой ситуации, поскольку пользователь - единственный, кто его использует и не является общедоступным, должно быть все в порядке.
Вы можете проверить https://golang.org/src/database/sql/sql.go?s=39599:39668#L1437 в строке 1478, что сначала будут подготовлены, а затем выполнены операторы sql.
В PostgreSQL подготовка действительна только для SELECT, INSERT, UPDATE, DELETE или VALUES, https://www.postgresql.org/docs/10/static/sql-prepare.html.
Здесь вы можете использовать Go fmt.Sprintf для поддержки создания различных таблиц и проверять имя таблицы вручную, имена таблиц SQL могут содержать много специальных символов, но вы можете сузить его, моя проверка - regexp.MustCompile ("^ [a-zA-Z_ ] + [0-9a-zA-Z _] * $ ").
Какие проблемы? Что именно не работает? Есть ли ошибки?