Heim > Artikel > Backend-Entwicklung > Kann die Sprache in die Datenbank geschrieben werden?
Go-Sprache kann Datenbanken schreiben. Der Unterschied zwischen der Go-Sprache und anderen Sprachen besteht darin, dass Go offiziell keinen Datenbanktreiber bereitstellt, sondern eine Standardschnittstelle zum Entwickeln von Datenbanktreibern schreibt. Der Vorteil davon ist, dass Entwickler entsprechende Datenbanktreiber entwickeln können Solange es sich um Code handelt, der gemäß Standardschnittstellen entwickelt wurde, sind bei einer zukünftigen Migration der Datenbank keine Änderungen erforderlich, was spätere Architekturanpassungen erheblich erleichtert.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
Eine Datenbank ist ein Lager, das Daten gemäß einer Datenstruktur organisiert, speichert und verwaltet. Im Vergleich zu anderen Speichermethoden ist die Speicherung nur eine der Funktionen der Datenbank, und die Datenorganisation und -verwaltung bilden den Kern der Datenbank.
Im Vergleich zu Datenbanken hat das Speichern von Daten in Dateien folgende Nachteile:
Angenommen, die IP des Remote-Hosts lautet: 192.168.1.1, der Benutzername ist root und das Passwort ist root. > mysql -h主机地址 -u用户名 -p用户密码
Beenden Sie den MySQL-Befehl
> mysql -h192.168.1.1 -uroot -proot
2. Datenbank/SQLGo betreibt die Datenbank über das Datenbank-/SQL-Paket und ein Datenbanktreiberpaket eines Drittanbieters, das die Datenbank-/SQL-/Treiberschnittstelle implementiert . Vollendet. Die Schnittstellen Conn und Stmt in Datenbank/SQL/Treiber werden offiziell einem Dritten zur Implementierung des Treibers übergeben und sind Coroutine-unsicher. DB und Stmt im offiziell implementierten Datenbank-/SQL-Paket sind Coroutine-sicher, da die interne Implementierung ein Verbindungspool ist.
Der Unterschied zwischen der Go-Sprache und anderen Sprachen besteht darin, dass Go offiziell keinen Datenbanktreiber bereitstellt, sondern eine Standardschnittstelle zum Entwickeln von Datenbanktreibern schreibt. Dies hat den Vorteil, dass bei einer zukünftigen Migration der Datenbank keine Änderungen erforderlich sind, solange der Code nach Standardschnittstellen entwickelt wird, was spätere Architekturanpassungen erheblich erleichtert.mysql> exit/quit;Register registriert und benennt eine Datenbank, die in der Open-Funktion zum Aktivieren des Treibers verwendet werden kann. Wenn Register denselben Namen zweimal registriert oder der Treiberparameter Null ist, kommt es zu Panik.
func Register(name string, driver driver.Driver)Das Paket ruft während des Einführungsprozesses automatisch die Init-Funktion im Paket auf. Daher müssen Sie bei der Registrierung des Datenbanktreibers nur den anonymen Import verwenden, um auf das Paket zu verweisen, damit der Code den Datenbanktreiber direkt verwenden kann.
func init() { sql.Register("mysql", &MySQLDriver{}) }
In der Go-Sprache stellt das SQL-Paket eine Open-Methode zum Erstellen einer Datenbankverbindung bereit.
import ( "database/sql" _ "github.com/go-sql-driver/mysql" )
Open öffnet eine durch „driverName“ angegebene Datenbank, und „dataSourceName“ gibt die Datenquelle an, die im Allgemeinen mindestens den Datenbankdateinamen und (mögliche) Verbindungsinformationen enthält.
Die Open-Funktion validiert lediglich ihre Parameter und stellt keine Verbindung zur Datenbank her. Wenn Sie prüfen möchten, ob der Name der Datenquelle zulässig ist, sollten Sie die Ping-Methode aufrufen, die einen Wert zurückgibt.
func Open(driverName, dataSourceName string) (*DB, error)
Ping prüft, ob die Verbindung zur Datenbank noch gültig ist und stellt bei Bedarf eine Verbindung her.
func (db *DB) Ping() error
Das Erstellen einer MySQL-Datentabelle erfordert die Definition des Tabellennamens, des Tabellenfeldnamens, des Feldtyps und der Einschränkungen. Die Syntaxstruktur zum Erstellen einer Datentabelle lautet:
package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" "log" ) func main() { db, err := sql.Open("mysql", "root:200039@tcp(127.0.0.1:3306)/gostudy") if err != nil { log.Fatal(err) } defer db.Close() //验证连接的可用性 err = db.Ping() if err != nil { log.Fatal("数据库连接失败:", err) } log.Println("数据库连接成功!") }
Erstellen Sie eine Datentabelle 使用Go语言创建数据表需要使用Exec函数。 Exec执行一次命令(包括查询、删除、更新、插入等),不返回任何执行结果。参数args表示query中的占位参数。 Exec的返回值为Result接口,Result的定义如下: Result主要有两个方法。LastInsertId返回一个数据库生成的回应命令的整数,当插入新行时,返回由数据库执行插入操作得到的自增ID号。RowsAffected返回被update、insert或delete命令影响的行数。 MySQL中使用INSERT INTO语句来插入数据,插入的语法结构为: 如果需要同时插入多条数据,可以使用如下方式: SQL注入(SQLi)是一种注入攻击,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加、修改和删除数据库中的记录。 sql包还提供一种预编译的方式来执行SQL语句,通常在处理批量SQL语句时会用到这种方式,这种方式比手动拼接字符串SQL语句高效,还可以防止SQL注入攻击。 Prepare创建一个准备好的状态用于之后的查询和命令。返回值可以同时执行多个查询和命令。 MySQL数据库使用SELECT语句来查询数据。以下为在MySQL数据库中查询数据通用的SELECT语法: 语法解释: 在Go语言中,我们可以使用Query函数来查询数据: Query执行一次查询,返回多行结果(即Rows),一般用于执行SELECT命令。参数args表示 如果需要修改或更新MySQL中的数据,我们可以使用UPDATE命令来操作。 语法解释: 注意:修改一行数据的多个列值时,SET子句的每个值用逗号分开即可。 MySQL使用DELETE语句从单个表中删除数据,语法格式为: 语法解释: 注意:在不使用WHERE条件的时候,将删除所有数据;数据库一旦删除数据,数据就会永远 MySQL数据库中的事务是用户一系列的数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特性简称为ACID原则。 原子性 事务必须是原子工作单元,事务中的操作要么全部执行,要么全都不执行,不能只完成部分操作。原子性在数据库系统中由恢复机制来实现。 一致性 事务开始之前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态。数 隔离性 系统必须保证事务不受其他并发执行事务的影响,即当多个事务同时运行时,各事务之间相 持久性 一个已完成的事务对数据所做的任何变动在系统中是永久有效的,即使该事务产生的修改不 事务的ACID原则保证了一个事务或者成功提交,或者失败回滚,二者必居其一。因此,它对事务的修改具有可恢复性,即当事务失败时,它对数据的修改都会恢复到该事务执行前的状态。 简单来说,事务处理就两个过程,要么成功提交,要么失败回滚,在Go语言中使用Tx结构体来表示事务。 Tx代表一个进行中的数据库事务。一次事务必须以对Commit或Rollback的调用结束。调用Commit或Rollback后,所有对事务的操作都会失败并返回错误值ErrTxDone。 数据库(Database) 所谓“数据库”,是以一定方式存储在一起、能与多个用户共享、具有尽可能小的冗余度、 数据表(Table) 数据表简称表,由一组数据记录组成,数据库中的数据是以表为单位进行组织的。一个表是 记录(Record) 表中的每一行称为一个记录,它由若干个字段组成。 字段(Field) 字段也称域。表中的每一列称为一个字段。每个字段都有相应的描述信息,如数据类型、数 索引(Index) Um die Effizienz des Datenbankzugriffs zu verbessern, können Sie Indizes für die Datenbank verwenden. Bei der Suche nach einem bestimmten Datensatz in einer größeren Datenbank Query Query ist ein SQL-Befehl (Structured Query Language), der verwendet wird, um einen bestimmten Satz von Datensätzen aus einer oder mehreren Tabellen abzurufen oder Filter Filter ist eine Komponente der Datenbank. Es kombiniert Indizierung und Sortierung, um Bedingungen festzulegen, und gibt dann die erforderlichen Daten gemäß den angegebenen Ansicht Die Datenansicht bezieht sich auf die Anzahl der gefundenen (oder verarbeiteten) Datensätze und die Reihenfolge, in der diese Datensätze angezeigt (oder verarbeitet) werden. Im Allgemeinen handelt es sich um eine zweidimensionale Tabelle. Beispielsweise können die Testergebnisse aller Schüler einer Klasse in einer Tabelle gespeichert werden. Jede Zeile in der Tabelle entspricht der Schülernummer und dem Namen des Schülers und Punkte für jeden Kurs. CREATE TABLE `user`(
`uid` INT(10) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(64) NULL DEFAULT 1,
`gender` TINYINT(1) NULL DEFAULT NULL,
`password` VARCHAR(64) NULL DEFAULT NULL,
`created` DATE NULL DEFAULT NULL,
PRIMARY KEY (`uid`)
);
func (db *DB) Exec(query string, args ...interface{}) (Result, error)
type Result interface {
LastInsertId() (int64, error)
RowsAffected() (int64, error)
}
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
INSERT INTO table_name (field1, field2,...fieldN) VALUES (valueA1,valueA2,...valueAN),(valueB1,valueB2,...value BN)......;
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
"time"
)
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
db, err := sql.Open("mysql", "root:200039@tcp(127.0.0.1:3306)/gostudy")
checkErr(err)
defer db.Close()
//验证连接可用性
err = db.Ping()
checkErr(err)
log.Println("数据库连接成功")
rs, err := db.Exec("insert into `user`(username,gender,password,created) values (?,?,?,?)", "tom", 1, "123456", time.Now())
checkErr(err)
rowCount, err := rs.RowsAffected()
checkErr(err)
log.Printf("插入了 % d行", rowCount)
}
func (db *DB) Prepare(query string) (*Stmt, error)
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
"time"
)
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
db, err := sql.Open("mysql", "root:200039@tcp(127.0.0.1:3306)/gostudy")
checkErr(err)
defer db.Close()
//验证连接可用性
err = db.Ping()
checkErr(err)
log.Println("数据库连接成功")
//rs, err := db.Exec("insert into `user`(username,gender,password,created) values (?,?,?,?)", "tom", 1, "123456", time.Now())
stmt, err := db.Prepare("INSERT INTO `user`(username,gender,password,created) VALUES (?,?,?,?)")
defer stmt.Close()
rs, err := stmt.Exec("Ailsa", 0, "111111", time.Now())
checkErr(err)
rowCount, err := rs.RowsAffected()
checkErr(err)
log.Printf("插入了 % d行", rowCount)
}
SELECT column_name,column_name
FROM <表 1>, <表 2>...
JOIN<表3>on...
[WHERE <表达式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}...]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
Query中的占位参数,Rows是查询的结果。它的游标指向结果集的第0行,使用Next方法来遍历各行结果。查询到数据后使用rows.Next获取一行结果,并使用Scan将查询到的结果赋值到目标变量中。func (r *Row) Scan(dest ...interface{}) error
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
)
type User struct {
Uid int
Username string
Gender bool
Password string
Created string
}
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
db, err := sql.Open("mysql", "root:200039@tcp(127.0.0.1:3306)/gostudy")
checkErr(err)
defer db.Close()
//验证连接的可用性
err = db.Ping()
checkErr(err)
log.Println("数据库连接成功!")
rows, err := db.Query("select * from `user` where username=?", "Tom")
defer rows.Close()
for rows.Next() {
user := User{}
err := rows.Scan(&user.Uid, &user.Username, &user.Gender, &user.Password, &user.Created)
checkErr(err)
log.Println(user)
}
}
UPDATE <表名>
SET 字段 1=值 1 [,字段 2=值 2... ]
[WHERE 子句 ]
[ORDER BY 子句]
[LIMIT 子句]
以是该列对应的默认值。如果指定的是默认值,可用关键字DEFAULT表示列值。rs, err := db.Exec("update `user` set password=? where sername=?","123123","john")
checkErr(err)
rowCount, err := rs.RowsAffected()
checkErr(err)
if rowCount > 0 {
log.Println("更新成功!")
}
DELETE FROM <表名>
[WHERE 子句]
[ORDER BY 子句]
[LIMIT 子句]
的所有行。
消失。因此,在执行DELETE语句之前,应该先备份数据库,以防需要找回被删除的数据。rs, err := db.Exec("delete from `user` where uid=?",3)
checkErr(err)
rowCount, err := rs.RowsAffected()
checkErr(err)
if rowCount > 0 {
log.Println("删除成功!")
}
据库一致性的定义是由用户负责的。例如,在银行转账中,用户可以定义转账前后两个账户金额之和保持不变。
互隔离,不可互相干扰。事务查看数据时数据所处的状态,要么是另一个并发事务修改它之前的状态,要么是另一个并发事务修改它之后的状态,事务不会查看中间状态的数据。隔离性通过系统的并发控制机制实现。
正确,错误也将一直保持。持久性通过恢复机制实现,发生故障时,可以通过日志等手段恢复数据库信息。type Tx interface{
Commit() error
Rollback() error
}
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
)
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func checkErrWithTx(err error, tx *sql.Tx) {
if err != nil {
tx.Rollback()
log.Fatal(err)
}
}
func main() {
db, err := sql.Open("mysql", "root:200039@tcp(127.0.0.1:3306)/gostudy")
checkErr(err)
defer db.Close()
//验证连接的可用性
err = db.Ping()
checkErr(err)
log.Println("数据库连接成功!")
var password string
tx, err := db.Begin()
checkErr(err)
//查找Tom的密码,如果密码为123456就将密码改为111111,否则不执行任何操作
err = tx.QueryRow("select password from `user` where username=?", "Tom").Scan(&password)
checkErrWithTx(err, tx)
if password == "123456" {
rs, err := tx.Exec("update `user` set password=? where username=?", "111111", "Tom")
checkErrWithTx(err, tx)
rowCount, err := rs.RowsAffected()
checkErrWithTx(err, tx)
if rowCount > 0 {
log.Println("密码更新完成!")
}
}
tx.Commit()
log.Println("事务处理完成!")
}
4、知识拓展
【Verwandte Empfehlungen:
与应用程序彼此独立的数据集合。MySQL中使用的数据库是关系型数据库(Relational Database)。一个数据库由一个或一组数据表组成。每个数据库都以文件的形式存放在磁盘上,即对应于一个物理文件。不同的数据库与物理文件对应的方式也不一样。
一组相关的按行排列的数据,每个表中都含有相同类型的信息。表实际上是一个二维表格,例如一个班所有学生的考试成绩可以存放在一个表中,表中的每一行对应一个学生,这一行包括学生的学号、姓名及各门课程成绩。
据宽度等。
gibt es einen großen Effizienzunterschied zwischen der Verwendung eines Index und der Nichtverwendung eines Index. Ein Index ist eigentlich eine spezielle Art von Tabelle, die die Werte von Schlüsselfeldern (vom Benutzer definiert) und Zeiger auf die tatsächlichen Speicherorte des Datensatzes enthält. Diese Werte und Zeiger werden in einer bestimmten Reihenfolge (ebenfalls vom Benutzer definiert) gespeichert ), damit diese in einer bestimmten (auch vom Benutzer definierten) Reihenfolge gespeichert werden können.
bestimmte Vorgänge für eine Tabelle auszuführen. Beim Lesen von Daten aus der Datenbank hoffen wir oft, dass die gelesenen Daten bestimmte Bedingungen erfüllen und nach einem bestimmten Feld sortiert werden können. Die Verwendung von SQL kann diesen Vorgang einfacher und effizienter machen. SQL ist eine nicht-prozedurale Sprache (manche nennen sie eine Sprache der vierten Generation). Wenn Sie sie verwenden, um einen bestimmten Datensatz zu finden, müssen Sie nur angeben, was zu tun ist, nicht wie. Jede Anweisung kann als Abfrage betrachtet werden. Gemäß dieser Abfrage können die erforderlichen Abfrageergebnisse abgerufen werden.
Bedingungen aus.
Das obige ist der detaillierte Inhalt vonKann die Sprache in die Datenbank geschrieben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!