MySQLデータベースの設計はPythonを利用してSchemaの操作方法を詳しく説明します。
弓は矢を射る前に、低い声で矢に言いました。「あなたの自由は私のものです。」Schemaは矢のようで、弓はPythonのようで、Pythonを選んで、Schemaの最大の自由です。自由は自分をより良くする機会であるべきです。
Schemaは何ですか?
どんな応用をしても、ユーザーと入力してつきあうだけで、ユーザーの入力データを信じないという原則があります。私たちはユーザーの入力を厳格に検証することを意味しています。web開発時、一般的に入力データはJSON形式で後端APIに送信されます。APIは入力データを検証します。一般的に私は多くの判断を加えるので、各种のif、コードはとても丑くて、1种の方式が比较的に优雅なのがユーザーのデータを検证することができますか?Schemaは役に立ちました。
MySQLdb部分
テーブル構造:
2)はtupleで、全部で7列です。列名、タイプ、表示サイズ、内部サイズ、精度、範囲、およびnull値を受け入れるかどうかの表記です。
デフォルトでは、取得方法がデータベースから「行」として返される値が元のグループです。
SQLには国際標準がありますが、残念なことに、各データベースメーカーはこれらの標準に対する解読が全部違っています。SQLの「方言」の違いを隠すために、SQLAlchemyなどのツールを開発しました。
SQLAlchemy接続モジュール:
2種類に分けます。悲観(DB Serverから提供される値)と楽観(SQLAlshemyから提供される値)の中で、楽観はまた分けられます。insertとudate
データの安全が信頼できる相手の前にさらされているかどうかは、安全意識のあるDBAでも冒されないリスクです。比較的良い方法は、Schema構造を可能な限り隠し、ユーザが入力したデータの完全性を検証することであり、これは一定の程度では、キャリアコストを増加させたが、安全には問題がない。
ここではコマンドラインツールの開発によってこの問題を説明します。
需要:テーブル構造を隠して、動的なクエリを実現し、結果をシミュレーションmysql\G出力します。
以上はMySQLデータベースの設計について、Pythonを利用してSchemaの操作方法を詳細に説明するすべての内容であり、皆さんの助けを期待しています。いらっしゃいませ。Pythonタイマーのインスタンスコード、Python生成デジタル画像コード共有など、何か問題があったらいつでもメッセージを残してください。編集者はすぐに皆さんに返事します。メッセージ交流討論を歓迎します。
Schemaは何ですか?
どんな応用をしても、ユーザーと入力してつきあうだけで、ユーザーの入力データを信じないという原則があります。私たちはユーザーの入力を厳格に検証することを意味しています。web開発時、一般的に入力データはJSON形式で後端APIに送信されます。APIは入力データを検証します。一般的に私は多くの判断を加えるので、各种のif、コードはとても丑くて、1种の方式が比较的に优雅なのがユーザーのデータを検证することができますか?Schemaは役に立ちました。
MySQLdb部分
テーブル構造:
mysql> use sakila;
mysql> desc actor;
+-------------+----------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+-------------------+-----------------------------+
| actor_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| first_name | varchar(45) | NO | | NULL | |
| last_name | varchar(45) | NO | MUL | NULL | |
| last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------+----------------------+------+-----+-------------------+-----------------------------+
4 rows in set (0.00 sec)
データベース接続モジュール:
[root@DataHacker ~]# cat dbapi.py
#!/usr/bin/env ipython
#coding = utf-8
#Author: [email protected]
#Time: 2014-1-29
import MySQLdb as dbapi
USER = 'root'
PASSWD = 'oracle'
HOST = '127.0.0.1'
DB = 'sakila'
conn = dbapi.connect(user=USER,passwd=PASSWD,host=HOST,db=DB)
1列のメタデータを印刷します。
[root@DataHacker ~]# cat QueryColumnMetaData.py
#!/usr/bin/env ipython
from dbapi import *
cur = conn.cursor()
statement = """select * from actor limit 1"""
cur.execute(statement)
print "output column metadata....."
print
for record in cur.description:
print record
cur.close()
conn.close()
1.execute()を呼び出した後、cursorはそのdescription属性を設定しなければならない。2)はtupleで、全部で7列です。列名、タイプ、表示サイズ、内部サイズ、精度、範囲、およびnull値を受け入れるかどうかの表記です。
[root@DataHacker ~]# chmod +x QueryColumnMetaData.py
[root@DataHacker ~]# ./QueryColumnMetaData.py
output column metadata.....
('actor_id', 2, 1, 5, 5, 0, 0)
('first_name', 253, 8, 45, 45, 0, 0)
('last_name', 253, 7, 45, 45, 0, 0)
('last_update', 7, 19, 19, 19, 0, 0)
2列名で列の値にアクセスするデフォルトでは、取得方法がデータベースから「行」として返される値が元のグループです。
In [1]: from dbapi import *
In [2]: cur = conn.cursor()
In [3]: v_sql = "select actor_id,last_name from actor limit 2"
In [4]: cur.execute(v_sql)
Out[4]: 2L
In [5]: results = cur.fetchone()
In [6]: print results[0]
58
In [7]: print results[1]
AKROYD
私たちはcursorclass属性を辞書として返します。
In [2]: import MySQLdb.cursors
In [3]: import MySQLdb
In [4]: conn = MySQLdb.connect(user='root',passwd='oracle',host='127.0.0.1',db='sakila',cursorclass=MySQLdb.cursors.DictCursor)
In [5]: cur = conn.cursor()
In [6]: v_sql = "select actor_id,last_name from actor limit 2"
In [7]: cur.execute(v_sql)
Out[7]: 2L
In [8]: results = cur.fetchone()
In [9]: print results['actor_id']
58
In [10]: print results['last_name']
AKROYD
二SQLAlchemy-SQL錬金術師SQLには国際標準がありますが、残念なことに、各データベースメーカーはこれらの標準に対する解読が全部違っています。SQLの「方言」の違いを隠すために、SQLAlchemyなどのツールを開発しました。
SQLAlchemy接続モジュール:
[root@DataHacker Desktop]# cat sa.py
import sqlalchemy as sa
engine = sa.create_engine('mysql://root:[email protected]/testdb',pool_recycle=3600)
metadata = sa.MetaData()
example 1:表の定義
In [3]: t = Table('t',metadata,
...: Column('id',Integer),
...: Column('name',VARCHAR(20)),
...: mysql_engine='InnoDB',
...: mysql_charset='utf8'
...: )
In [4]: t.create(bind=engine)
example 2:テーブル削除
2 , :
In [5]: t.drop(bind=engine,checkfirst=True)
:
In [5]: metadata.drop_all(bind=engine,checkfirst=True), tables
example 3:5の制約
3 .1 primary key
2 , ,
In [7]: t_pk_col = Table('t_pk_col',metadata,Column('id',Integer,primary_key=True),Column('name',VARCHAR(20)))
In [8]: t_pk_col.create(bind=engine)
In [9]: t_pk_tb = Table('t_pk_01',metadata,Column('id',Integer),Column('name',VARCHAR(20)),PrimaryKeyConstraint('id','name',name='prikey'))
In [10]: t_pk_tb.create(bind=engine)
3.2 Foreign Key
In [13]: t_fk = Table('t_fk',metadata,Column('id',Integer,ForeignKey('t_pk.id')))
In [14]: t_fk.create(bind=engine)
In [15]: t_fk_tb = Table('t_fk_tb',metadata,Column('col1',Integer),Column('col2',VARCHAR(10)),ForeignKeyConstraint(['col1','col2'],['t_pk.id','t_pk.name']))
In [16]: t_fk_tb.create(bind=engine)
3.3 unique
In [17]: t_uni = Table('t_uni',metadata,Column('id',Integer,unique=True))
In [18]: t_uni.create(bind=engine)
In [19]: t_uni_tb = Table('t_uni_tb',metadata,Column('col1',Integer),Column('col2',VARCHAR(10)),UniqueConstraint('col1','col2'))
In [20]: t_uni_tb.create(bind=engine)
3.4 check
, MySQL check 。 。
3.5 not null
In [21]: t_null = Table('t_null',metadata,Column('id',Integer,nullable=False))
In [22]: t_null.create(bind=engine)
4標準値2種類に分けます。悲観(DB Serverから提供される値)と楽観(SQLAlshemyから提供される値)の中で、楽観はまた分けられます。insertとudate
4.1 :insert
In [23]: t_def_inser = Table('t_def_inser',metadata,Column('id',Integer),Column('name',VARCHAR(10),server_default='cc'))
In [24]: t_def_inser.create(bind=engine)
3.2 :update
In [25]: t_def_upda = Table('t_def_upda',metadata,Column('id',Integer),Column('name',VARCHAR(10),server_onupdate='DataHacker'))
In [26]: t_def_upda.create(bind=engine)
3.3 :Passive
In [27]: t_def_pass = Table('t_def_pass',metadata,Column('id',Integer),Column('name',VARCHAR(10),DefaultClause('cc')))
In [28]: t_def_pass.create(bind=engine)
隠しスクリーンデータの安全が信頼できる相手の前にさらされているかどうかは、安全意識のあるDBAでも冒されないリスクです。比較的良い方法は、Schema構造を可能な限り隠し、ユーザが入力したデータの完全性を検証することであり、これは一定の程度では、キャリアコストを増加させたが、安全には問題がない。
ここではコマンドラインツールの開発によってこの問題を説明します。
需要:テーブル構造を隠して、動的なクエリを実現し、結果をシミュレーションmysql\G出力します。
:
[root@DataHacker ~]# ./sesc.py --version
1.0
:
[root@DataHacker ~]# ./sesc.py -h
Usage: sesc.py [options] <arg1> <arg2> [<arg3>...]
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-q TERM assign where predicate
-c COL, --column=COL assign query column
-t TABLE assign query table
-f, --format -f must match up -o
-o OUTFILE assign output file
:
[root@DataHacker ~]# ./sesc.py -t actor -c last_name -q s% -f -o output.txt
[root@DataHacker ~]# cat output.txt
************ 1 row *******************
actor_id: 180
first_name: JEFF
last_name: SILVERSTONE
last_update: 2006-02-15 04:34:33
************ 2 row *******************
actor_id: 195
first_name: JAYNE
last_name: SILVERSTONE
last_update: 2006-02-15 04:34:33
......< >......
コードを見てください
#!/usr/bin/env python
import optparse
from dbapi import *
# OptionParser ,
parser = optparse.OptionParser(usage="%prog [options] <arg1> <arg2> [<arg3>...]",version='1.0',)
# , add_option
parser.add_option("-q",action="store",type="string",dest="term",help="assign where predicate")
parser.add_option("-c","--column",action="store",type="string",dest="col",help="assign query column")
parser.add_option("-t",action="store",type="string",dest="table",help="assign query table")
parser.add_option("-f","--format",action="store_true",dest="format",help="-f must match up -o")
parser.add_option("-o",action="store",type="string",dest="outfile",help="assign output file")
#
options,args = parser.parse_args()
# dest
table = options.table
column = options.col
term = options.term
format = options.format
#
statement = "select * from %s where %s like '%s'"%(table,column,term)
cur = conn.cursor()
cur.execute(statement)
results = cur.fetchall()
# \G
if format is True:
columns_query = "describe %s"%(table)
cur.execute(columns_query)
heards = cur.fetchall()
column_list = []
for record in heards:
column_list.append(record[0])
output = ""
count = 1
for record in results:
output = output + "************ %s row ************
"%(count)
for field_no in xrange(0, len(column_list)):
output = output + column_list[field_no]+ ": " + str(record[field_no]) + "
"
output = output + "
"
count = count + 1
else:
output = []
for record in xrange(0,len(results)):
output.append(results[record])
output = ''.join(output)
#
if options.outfile:
outfile = options.outfile
with open(outfile,'w') as out:
out.write(output)
else:
print output
#
conn.close()
cur.close()
締め括りをつける以上はMySQLデータベースの設計について、Pythonを利用してSchemaの操作方法を詳細に説明するすべての内容であり、皆さんの助けを期待しています。いらっしゃいませ。Pythonタイマーのインスタンスコード、Python生成デジタル画像コード共有など、何か問題があったらいつでもメッセージを残してください。編集者はすぐに皆さんに返事します。メッセージ交流討論を歓迎します。