Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
4.2 kB
6
Indexable
package main

import (
	"database/sql"
	"fmt"
	sq "github.com/Masterminds/squirrel"
	_ "github.com/mattn/go-sqlite3"
)

type User struct {
	ID       int
	Username string
	Email    string
}

// Создание таблицы пользователей
func CreateUserTable() error {
	// Ваш код здесь
	db, err := sql.Open("sqlite3", "users.db")
	if err != nil {
		fmt.Println("Ошибка при подключении к базе данных:", err)
		return err
	}
	defer db.Close()

	// Создание таблицы
	_, err = db.Exec(`CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT,
email TEXT
)`)
	if err != nil {
		fmt.Println("Ошибка при создании таблицы:", err)
		return err
	}

	fmt.Println("Таблица успешно создана")
	return nil
}

// Вставка пользователя в таблицу
func InsertUser(user User) error {
	db, err := sql.Open("sqlite3", "users.db")
	if err != nil {
		return err
	}
	defer db.Close()

	query, args, err := PrepareQuery("insert", "users", user)
	if err != nil {
		return err
	}

	_, err = db.Exec(query, args...)
	if err != nil {
		return err
	}

	return nil
}

// Выборка пользователя из таблицы
func SelectUser(userID int) (User, error) {
	// Ваш код здесь
	db, err := sql.Open("sqlite3", "users.db")
	if err != nil {
		fmt.Println("Ошибка при подключении к базе данных:", err)
		return User{}, err
	}
	defer db.Close()
	// Выборка данных
	query, _, err := PrepareQuery("select", "users", User{ID: userID})
	if err != nil {
		return User{}, err
	}
	rows, err := db.Query(query)
	if err != nil {
		return User{}, err
	}
	defer rows.Close()

	for rows.Next() {
		var id int
		var name string
		var email string
		err = rows.Scan(&id, &name, &email)
		if err != nil {
			fmt.Println("Ошибка при сканировании данных:", err)
			return User{}, nil
		}
		if id == userID {
			user := User{
				ID:       id,
				Username: name,
				Email:    email,
			}
			return user, nil
		}
	}

	return User{}, fmt.Errorf("error: empty user")
}

// Обновление информации о пользователе
func UpdateUser(user User) error {
	// Ваш код здесь
	db, err := sql.Open("sqlite3", "users.db")
	if err != nil {
		fmt.Println("Ошибка при подключении к базе данных:", err)
		return err
	}
	defer db.Close()
	query, args, err := PrepareQuery("update", "users", user)
	if err != nil {
		return err
	}
	// Обновление данных
	_, err = db.Exec(query, args...)
	if err != nil {
		fmt.Println("Ошибка при обновлении данных:", err)
		return err
	}
	return nil
}

// Удаление пользователя из таблицы
func DeleteUser(userID int) error {
	// Ваш код здесь
	db, err := sql.Open("sqlite3", "users.db")
	if err != nil {
		fmt.Println("Ошибка при подключении к базе данных:", err)
		return err
	}
	defer db.Close()

	// Удаление данных
	query, args, err := PrepareQuery("delete", "users", User{ID: userID})
	_, err = db.Exec(query, args...)
	if err != nil {
		fmt.Println("Ошибка при удалении данных:", err)
		return err
	}
	return nil
}

// Функция для подготовки запроса
func PrepareQuery(operation string, table string, user User) (string, []interface{}, error) {
	// Ваш код здесь insert, select, update, delete
	switch operation {
	case "insert":
		query, args, err := sq.
			Insert(table).Columns("username", "email").
			Values(user.Username, user.Email).
			ToSql()
		return query, args, err
	case "select":
		query, args, err := sq.Select("*").From(table).ToSql()
		return query, args, err
	case "update":
		query, args, err := sq.
			Update(table).
			Set("email", user.Email).Set("username", user.Username).
			Where("id = ?", user.ID).ToSql()
		return query, args, err
	case "delete":
		query, args, err := sq.
			Delete(table).
			Where("id = ?", user.ID).
			ToSql()
		return query, args, err
	}
	return "", nil, nil
}

func main() {