当前位置: 首页 > news >正文

数据库网站 模板800元做网站

数据库网站 模板,800元做网站,网站建设推广注意什么,东莞做网站的公司有哪些初始化数据库表结构代码。 这次遇到个新手坑,之前直接用代码是成功的,封装后发现不报错也不能成功创建表了。 排查问题后,发现是因为在封装的时候,把defer db.Close()释放连接的方法写在了封装方法initDB()中。 defer 这个关键字的…

初始化数据库表结构代码。
这次遇到个新手坑,之前直接用代码是成功的,封装后发现不报错也不能成功创建表了。
排查问题后,发现是因为在封装的时候,把defer db.Close()释放连接的方法写在了封装方法initDB()中。
defer 这个关键字的特点是延迟执行,会在函数结束时,应该时return之前执行,所以写在封装方法initDB中,就会导致initDB()运行结束后,直接就释放了数据库连接,致使之后创建表的函数都是处于未创建数据库连接的环境下运行的,导致最后没有创建成功。

package main//引用的包
import ("database/sql""fmt""log""strings"_ "github.com/lib/pq" //pgsql数据库组件
)// 定义数据库相关配置
const (host     = "localhost"        //数据库ipport     = 5432               //数据库端口user     = "postgres"         //数据库用户名password = "postgres"         //数据库密码dbname   = "postgresLearning" //数据库名
)// 启动函数
func main() {//初始化数据库连接db := initDB()defer db.Close() //defer db.Close() 是 Go 语言中一种确保资源被正确释放的惯用写法,它的作用是://在函数返回前,自动调用 db.Close() 来关闭数据库连接,无论函数是正常返回还是发生 paniccreateUserTable(db)  //创建users表createTest1Table(db) //创建test1表createTest2Table(db) //创建test2表
}// 创建users表
func createUserTable(db *sql.DB) {createTable := Table{Name: "users",Columns: []Column{{Name: "id", Type: SERIAL, Primary: true},{Name: "username", Type: VARCHAR, Length: 50, Unique: true, NotNull: true},{Name: "password", Type: VARCHAR, Length: 100, NotNull: true},{Name: "email", Type: VARCHAR, Length: 100, Unique: true, NotNull: true},{Name: "created_at", Type: TIMESTAMP, Default: "CURRENT_TIMESTAMP"},{Name: "updated_at", Type: TIMESTAMP, Default: "CURRENT_TIMESTAMP"},},}success, createTableSQL := CreateTable(createTable)if success {db.Exec(createTableSQL)fmt.Println("创建Users数据表完成")}
}// 创建test1表
func createTest1Table(db *sql.DB) {createTable := Table{Name: "test1",Columns: []Column{{Name: "id", Type: SERIAL, Primary: true},{Name: "name", Type: VARCHAR, Length: 50, Unique: true, NotNull: true},{Name: "age", Type: INT, NotNull: true},{Name: "created_at", Type: TIMESTAMP, Default: "CURRENT_TIMESTAMP"},{Name: "updated_at", Type: TIMESTAMP, Default: "CURRENT_TIMESTAMP"},},}success, createTableSQL := CreateTable(createTable)if success {db.Exec(createTableSQL)fmt.Println("创建Test1数据表完成")}
}// 创建test2表
func createTest2Table(db *sql.DB) {createTable := Table{Name: "test2",Columns: []Column{{Name: "id", Type: SERIAL, Primary: true},{Name: "name", Type: VARCHAR, Length: 50, Unique: true, NotNull: true},{Name: "age", Type: INT, NotNull: true},{Name: "created_at", Type: TIMESTAMP, Default: "CURRENT_TIMESTAMP"},{Name: "updated_at", Type: TIMESTAMP, Default: "CURRENT_TIMESTAMP"},},}success, createTableSQL := CreateTable(createTable)if success {db.Exec(createTableSQL)fmt.Println("创建Test1数据表完成")}
}// 初始化数据库连接
func initDB() *sql.DB {// 构建连接字符串psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",host, port, user, password, dbname)// 连接数据库db, err := sql.Open("postgres", psqlInfo)if err != nil {log.Fatal(err)}//defer db.Close()  这里有一个注意点,这块代码回直接关闭数据库连接// 检查连接err = db.Ping()if err != nil {log.Fatal(err)}fmt.Println("Successfully connected to PostgreSQL database!")return db
}// ColumnItemType 定义列类型的自定义类型
type ColumnItemType string// 支持的列类型常量
const (VARCHAR   ColumnItemType = "VARCHAR"TIMESTAMP ColumnItemType = "TIMESTAMP"SERIAL    ColumnItemType = "SERIAL"TEXT      ColumnItemType = "TEXT"DECIMAL   ColumnItemType = "DECIMAL"INT       ColumnItemType = "INT"
)// Column 定义字段结构
type Column struct {Name    stringType    ColumnItemTypeLength  int // 长度,仅对 VARCHAR、DECIMAL 等有效NotNull boolUnique  boolPrimary boolDefault string
}// Table 定义表结构
type Table struct {Name    stringColumns []Column
}// CreateTable 生成 CREATE TABLE SQL 语句
func CreateTable(table Table) (bool, string) {if table.Name == "" {fmt.Printf("表名不能为空")return false, ""}if len(table.Columns) == 0 {fmt.Printf("字段列表不能为空")return false, ""}var fieldDefs []stringfor _, col := range table.Columns {if col.Name == "" {fmt.Printf("字段名不能为空")return false, ""}def := col.Name + " " + string(col.Type) // 注意:col.Type 是 ColumnItemType,需转为 string// 处理长度(仅对支持长度的类型)if col.Length > 0 {// 可以根据 Type 判断是否支持 Length,例如只对 VARCHAR 和 DECIMAL 生效def += fmt.Sprintf("(%d)", col.Length)}// 添加约束if col.NotNull {def += " NOT NULL"}if col.Unique {def += " UNIQUE"}if col.Primary {def += " PRIMARY KEY"}if col.Default != "" {def += " DEFAULT " + col.Default}fieldDefs = append(fieldDefs, def)}// 拼接完整 SQLsql := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s (%s);",table.Name,strings.Join(fieldDefs, ", "),)return true, sql
}
http://www.dtcms.com/a/611569.html

相关文章:

  • HashMap扩容机制深度解析:从源码到实战的完整指南
  • 网站建设与管理中专专业怎么邀约客户做网站
  • 公司网站推广如何做网站建设外地便宜
  • 必要是什么网站湖南建设工程招标网
  • seo是什么品牌seo代运营公司
  • 大专网站建设资料南昌网站建设培训班
  • 助力V2G,米尔SECC GreenPHY实战开发
  • 湖北洪湖市建设局网站个人博客响应式模板
  • 龙岩建设局网站声明网站搜索引擎优化主要方法
  • 联想网站建设与分析网络公司项目
  • 有什么网站做头像wordpress博客注册
  • 和15岁女儿做很舒服网站浏览器打开网站
  • 如何微信做演讲视频网站wordpress同步到微信
  • 【代码审计】迅睿CMS V4.6.2 Phar反序列化 RCE
  • 网站定制设计服务需要使用的技术三好街网站建设与维护
  • 哪些指纹浏览器支持模拟SSL指纹
  • 宜春做网站哪里好惠州网站建设领头
  • 【电机控制】基于STM32F103C8T6的二轮平衡车设计——LQR线性二次线控制器(算法篇)
  • BuildingAI 控制台智能体菜单和页面技术架构
  • 保定网站制作系统陕西省网站开发
  • 如何在跨部门沟通失误后进行协调与澄清
  • VS2010 C语言编译器使用教程 | 如何高效配置和优化C语言编译环境
  • 常州网站建设要多少钱濮阳免费网站建设
  • 学了lamp做网站就足够了吗无忧中英繁企业网站系统 完整
  • ubuntu:beyond compare 4 This license key has been revoked 解决办法
  • 基于OSip协议栈的GB28181视频平台--jrtp传输过程中作为接收方不发送rtcp包问题处理
  • java加密启动报错
  • SpringAOP、连接点、通知类型、通知顺序、切入点表达式
  • 平面设计师参考网站开发公司总经理竞聘报告
  • 手机可以看的网站如何查看网站是什么语言做的