mysqlデータベースに接続します
その前に、正しいnpmパッケージをインストールしてください。
npm install mysql
mysqlは、必要なすべての機能を提供する非常に使いやすいモジュールです。インストール後、データベースに接続するために必要な方法は次のとおりです。
var mysql = require('mysql')
var connection = mysql.createConnection({
host: 'localhost',
user: 'your_user',
password: 'some_secret',
database: 'database'
})
connection.connect(function(err) {
if (err) throw err
console.log('You are now connected...')
})
これで、データベースの読み取りと書き込みができます。
mysqlデータベースの読み取りと書き込み
データベースへの接続方法はすでに知っているので、簡単な例を見てみましょう。
var mysql = require('mysql')
var connection = mysql.createConnection({
host: 'localhost',
user: 'your_user',
password: 'some_secret',
database: 'database'
})
connection.connect(function(err) {
if (err) throw err
console.log('You are now connected...')
connection.query('CREATE TABLE people(id int primary key, name varchar(255), age int, address text)', function(err, result) {
if (err) throw err
connection.query('INSERT INTO people (name, age, address) VALUES (?, ?, ?)', ['Larry', '41', 'California, USA'], function(err, result) {
if (err) throw err
connection.query('SELECT * FROM people', function(err, results) {
if (err) throw err
console.log(results[0].id)
console.log(results[0].name)
console.log(results[0].age)
console.log(results[0].address)
})
})
})
})
上のプレースホルダーを見ると、?
使いやすくなるだけでなく、安全でもあります。
db.jsファイルを置き換えます
表示されるmysqlモジュールは非常に簡単ですが、実際のアプリケーションにはより複雑な要件があります。これが、MongoDBの接続と操作で、接続の管理に役立つ別のファイルdb.jsを作成する理由です。
その機能は、資格情報を頻繁に入力する必要がないときはいつでも、データベースに簡単に接続することです。2番目の目標は、テストを簡単に実行することです。
var mysql = require('mysql')
, async = require('async')
var PRODUCTION_DB = 'app_prod_database'
, TEST_DB = 'app_test_database'
exports.MODE_TEST = 'mode_test'
exports.MODE_PRODUCTION = 'mode_production'
var state = {
pool: null,
mode: null,
}
exports.connect = function(mode, done) {
state.pool = mysql.createPool({
host: 'localhost',
user: 'your_user',
password: 'some_secret',
database: mode === exports.MODE_PRODUCTION ? PRODUCTION_DB : TEST_DB
})
state.mode = mode
done()
}
exports.get = function() {
return state.pool
}
exports.fixtures = function(data) {
var pool = state.pool
if (!pool) return done(new Error('Missing database connection.'))
var names = Object.keys(data.tables)
async.each(names, function(name, cb) {
async.each(data.tables[name], function(row, cb) {
var keys = Object.keys(row)
, values = keys.map(function(key) {
return "'" + row[key] + "'" })
pool.query('INSERT INTO ' + name + ' (' + keys.join(',') + ') VALUES (' + values.join(',') + ')', cb)
}, cb)
}, done)
}
exports.drop = function(tables, done) {
var pool = state.pool
if (!pool) return done(new Error('Missing database connection.'))
async.each(tables, function(name, cb) {
pool.query('DELETE * FROM ' + name, cb)
}, done)
}
このdb.jsは、以前のものよりも少し複雑です。
まず、データベースに接続する方法を提供します。実動モジュールとテストモジュール
に接続できます。テストモジュールは、自動テスト中にのみ実行されます。
次に、get
常に有効な接続を提供する方法があり、データベースのクエリにも使用できます。さらに、パスワードを設定することができ、他のモジュールもこのメソッドを呼び出すことができます。
最後に、2つの方法がfixtures
ありdrop
、テストを終了するのは簡単です。
ドロップはデータをクリアします。テストする前にテストデータベースを常に空にするのに役立ちます。
フィクスチャはjsonオブジェクトを使用してデータベースにデータをロードします。例を参照してください。
var data = {
tables: {
people: [
{id: 1, name: "John", age: 32},
{id: 2, name: "Peter", age: 29},
],
cars: [
{id: 1, brand: "Jeep", model: "Cherokee", owner_id: 2},
{id: 2, brand: "BMW", model: "X5", owner_id: 2},
{id: 3, brand: "Volkswagen", model: "Polo", owner_id: 1},
],
},
}
var db = require('./db')
db.connect(db.MODE_PRODUCTION, function() {
db.fixtures(data, function(err) {
if (err) return console.log(err)
console.log('Data has been loaded...')
})
})
SQLを使用してモジュールを構築する
すべての準備が整いました。アプリケーションでdb.jsを使用する方法を見てみましょう。例を見てみましょう:
controllers/
comments.js
users.js
models/
comment.js
user.js
views/
app.js
db.js
package.json
app.jsは、アプリケーションのエントリポイントであり、データベース接続を設定する場所です。例を見てみましょう:
var db = require('./db')
app.use('/comments', require('./controllers/comments'))
app.use('/users', require('./controllers/users'))
// Connect to MySQL on start
db.connect(db.MODE_PRODUCTION, function(err) {
if (err) {
console.log('Unable to connect to MySQL.')
process.exit(1)
} else {
app.listen(3000, function() {
console.log('Listening on port 3000...')
})
}
})
アプリケーションは、このモジュールを介してデータベースと対話します。例を見てみましょう:
var db = require('../db.js')
exports.create = function(userId, text, done) {
var values = [userId, text, new Date().toISOString()]
db.get().query('INSERT INTO comments (user_id, text, date) VALUES(?, ?, ?)', values, function(err, result) {
if (err) return done(err)
done(null, result.insertId)
})
}
exports.getAll = function(done) {
db.get().query('SELECT * FROM comments', function (err, rows) {
if (err) return done(err)
done(null, rows)
})
}
exports.getAllByUser = function(userId, done) {
db.get().query('SELECT * FROM comments WHERE user_id = ?', userId, function (err, rows) {
if (err) return done(err)
done(null, rows)
})
}
ご覧のとおり、db.jsは、有料でデータベースに接続する必要がないという問題です。また、本番環境でもテスト環境でも問題です。
読み取りと書き込みに異なるインスタンスを使用する
アプリケーションのニーズが高まるにつれ、今日の多くのアプリケーションは読み取り指向になっています。これは、人々がデータを書き込むよりもデータを読み取ることが少ないことを意味します。たとえば、このタイプのアプリケーションのすべてのソーシャルネットワーキングサイトでは、ステータスは通常1回だけ読み取られますが、その後何千人もの人々によって読み取られます。この場合、通常、すべての書き込みを受け入れるメインデータベースがあり、一部のMySQLインスタンスに同期すると、要求のみが読み取られます。ユーザー数が多い場合は、読み取るデータベースを簡単に追加できますが、アプリケーションは引き続き非常に高速です。
しかし、初期化でこの問題を解決するにはどうすればよいですか?mysqlモジュールのPoolCluster機能は非常に便利で、複数のインスタンスを構成してから、それらすべてに接続できます。db.jsの例を見てください。
var mysql = require('mysql')
, async = require('async')
var PRODUCTION_DB = 'app_prod_database'
, TEST_DB = 'app_test_database'
exports.MODE_TEST = 'mode_test'
exports.MODE_PRODUCTION = 'mode_production'
var state = {
pool: null,
mode: null,
}
exports.connect = function(mode, done) {
if (mode === exports.MODE_PRODUCTION) {
state.pool = mysql.createPoolCluster()
state.pool.add('WRITE', {
host: '192.168.0.5',
user: 'your_user',
password: 'some_secret',
database: PRODUCTION_DB
})
state.pool.add('READ1', {
host: '192.168.0.6',
user: 'your_user',
password: 'some_secret',
database: PRODUCTION_DB
})
state.pool.add('READ2', {
host: '192.168.0.7',
user: 'your_user',
password: 'some_secret',
database: PRODUCTION_DB
})
} else {
state.pool = mysql.createPool({
host: 'localhost',
user: 'your_user',
password: 'some_secret',
database: TEST_DB
})
}
state.mode = mode
done()
}
exports.READ = 'read'
exports.WRITE = 'write'
exports.get = function(type, done) {
var pool = state.pool
if (!pool) return done(new Error('Missing database connection.'))
if (type === exports.WRITE) {
state.pool.getConnection('WRITE', function (err, connection) {
if (err) return done(err)
done(null, connection)
})
} else {
state.pool.getConnection('READ*', function (err, connection) {
if (err) return done(err)
done(null, connection)
})
}
}
exports.fixtures = function(data) {
var pool = state.pool
if (!pool) return done(new Error('Missing database connection.'))
var names = Object.keys(data.tables)
async.each(names, function(name, cb) {
async.each(data.tables[name], function(row, cb) {
var keys = Object.keys(row)
, values = keys.map(function(key) {
return "'" + row[key] + "'" })
pool.query('INSERT INTO ' + name + ' (' + keys.join(',') + ') VALUES (' + values.join(',') + ')', cb)
}, cb)
}, done)
}
exports.drop = function(tables, done) {
var pool = state.pool
if (!pool) return done(new Error('Missing database connection.'))
async.each(tables, function(name, cb) {
pool.query('DELETE * FROM ' + name, cb)
}, done)
}
前のものと異なる点が3つあります。
- テストモードで接続方法で接続する場合は、前と同じようにしてください。ただし、本番モードの場合は、さらに3台のサーバーを追加します。各サーバーには名前があり、最初のサーバーは
WRITE
で、他の2つはREAD1
合計READ2
です。それぞれの目的が何であるかを明確にする必要があります。READ1
そして、READ2
あるWRITE
奴隷、そのたびに誰かがにデータを書き込みWRITE
、その後、迅速にREAD1
かつREAD2
利用可能。 - 2番目の変更は
get
メソッドです。以前は、すぐに接続を返していました。これで、2番目のパラメーターとして提供されたコールバック関数への接続が返されます。 - 最後の変更は
get
メソッドにあります。データベースに接続するときは、接続のタイプにREADとWRITEを指定する必要があります。次に、サーバーに設定された名前に従って、正しいタイプの接続を提供します。この場合getConnection
、適切なデータベースを選択できるようにパターンシステムが提供されていることがわかります。
次に、db.jsの使用例を見てみましょう。
var db = require('../db.js')
exports.create = function(userId, text, done) {
var values = [userId, text, new Date().toISOString()]
db.get(db.WRITE, function(err, connection) {
if (err) return done('Database problem')
connection.query('INSERT INTO comments (user_id, text, date) VALUES(?, ?, ?)', values, function(err, result) {
if (err) return done(err)
done(null, result.insertId)
})
})
}
exports.getAll = function(done) {
db.get(db.READ, function(err, connection) {
if (err) return done('Database problem')
connection.query('SELECT * FROM comments', function (err, rows) {
if (err) return done(err)
done(null, rows)
})
})
}
exports.getAllByUser = function(userId, done) {
db.get(db.READ, function(err, connection) {
if (err) return done('Database problem')
connection.query('SELECT * FROM comments WHERE user_id = ?', userId, function (err, rows) {
if (err) return done(err)
done(null, rows)
})
})
}
プロキシ接続オブジェクトを作成することもできます。これに基づいてクエリを実行し、これが書き込みか読み取りかを理解してから、適切な接続を選択します。このようにして、モジュールを変更することさえありません。
やっと
この記事のほとんどはhttps://www.terlici.com/2015/08/13/mysql-node-express.htmlから翻訳されています。間違えた場合は、メッセージを残すことができます。