校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > MySQL數據庫設計之利用Python操作Schema方法詳解

MySQL數據庫設計之利用Python操作Schema方法詳解

熱門標簽:400電話申請什么好 百度地圖標注地方備注 電銷機器人價格多少錢一臺 地圖標注圖標素材入駐 電話機器人免費嗎 怎么申請400電話申請 龍圖酒吧地圖標注 怎么辦理400電話呢 好搜地圖標注

弓在箭要射出之前,低聲對箭說道,“你的自由是我的”。Schema如箭,弓似Python,選擇Python,是Schema最大的自由。而自由應是一個能使自己變得更好的機會。

Schema是什么?

不管我們做什么應用,只要和用戶輸入打交道,就有一個原則--永遠不要相信用戶的輸入數據。意味著我們要對用戶輸入進行嚴格的驗證,web開發時一般輸入數據都以JSON形式發送到后端API,API要對輸入數據做驗證。一般我都是加很多判斷,各種if,導致代碼很丑陋,能不能有一種方式比較優雅的驗證用戶數據呢?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: linwaterbin@gmail.com 
#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:oracle@127.0.0.1/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和update

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) 

㈢ 隱藏Schema

數據的安全是否暴露在完全可信任的對象面前,這是任何有安全意識的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 ************\n\n"%(count)
  for field_no in xrange(0, len(column_list)):
   output = output + column_list[field_no]+ ": " + str(record[field_no]) + "\n"
  output = output + "\n"
  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生成數字圖片代碼分享等,有什么問題可以隨時留言,小編會及時回復大家的,歡迎留言交流討論。

您可能感興趣的文章:
  • Python通過Schema實現數據驗證方式
  • python導出hive數據表的schema實例代碼
  • python讀取hdfs上的parquet文件方式
  • 解決python將xml格式文件轉換成txt文件的問題(xml.etree方法)
  • python 如何將字典寫為json文件
  • Python 標準庫zipfile將文件夾加入壓縮包的操作方法
  • python文件處理--文件讀寫詳解
  • 用 Python 定義 Schema 并生成 Parquet 文件詳情

標簽:內江 固原 浙江 防疫工作 廣西 撫順 溫州 汕尾

巨人網絡通訊聲明:本文標題《MySQL數據庫設計之利用Python操作Schema方法詳解》,本文關鍵詞  MySQL,數據庫,設計,之,利用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL數據庫設計之利用Python操作Schema方法詳解》相關的同類信息!
  • 本頁收集關于MySQL數據庫設計之利用Python操作Schema方法詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    三级不卡在线观看| 欧美体内she精高潮| 亚洲成人综合网站| 亚洲视频一区在线| 中文字幕一区在线观看视频| 国产亚洲欧美日韩俺去了| 久久天天做天天爱综合色| 久久天天做天天爱综合色| 久久亚洲免费视频| 中文字幕av一区二区三区免费看 | 久久久精品欧美丰满| 精品国免费一区二区三区| 日韩精品中文字幕在线不卡尤物 | 日本亚洲免费观看| 麻豆一区二区三区| 国产精品18久久久久久久网站| 国产成人精品亚洲日本在线桃色| 国产一区不卡精品| 成人av影院在线| 91福利视频网站| 欧美一区二区三区日韩视频| 久久综合九色综合97婷婷 | 亚洲一区二区三区精品在线| 日日夜夜精品视频免费| 国产又黄又大久久| 在线观看免费视频综合| 欧美一区三区二区| 最新日韩在线视频| 日韩av中文在线观看| 粉嫩一区二区三区性色av| 色噜噜久久综合| 欧美一级搡bbbb搡bbbb| 中文字幕不卡在线| 日日摸夜夜添夜夜添亚洲女人| 国产一区二区三区在线观看精品| www.亚洲色图| 欧美一卡二卡在线观看| 国产精品日日摸夜夜摸av| 首页亚洲欧美制服丝腿| 粉嫩av一区二区三区粉嫩| 欧美日韩综合一区| 欧美激情一区二区三区全黄| 亚洲成人一区在线| 成人免费电影视频| 日韩一区二区在线看片| 亚洲摸摸操操av| 国产一区二区三区四区五区美女 | 欧美一级片在线看| 一区二区三区四区不卡在线| 国产一区二区三区久久悠悠色av| 欧洲人成人精品| 国产精品久久久久三级| 久久99国内精品| 欧美色电影在线| 亚洲色图在线看| 成人亚洲一区二区一| 日韩精品一区二区三区视频| 亚洲一区二区三区自拍| 91网站最新地址| 国产精品毛片久久久久久| 男男gaygay亚洲| 在线播放/欧美激情| 亚洲综合图片区| 色偷偷成人一区二区三区91| 国产精品私人自拍| 国产69精品一区二区亚洲孕妇| 在线观看日韩高清av| 在线观看91精品国产入口| 日本亚洲欧美天堂免费| 99精品视频一区二区三区| 欧美一区二区三区视频免费播放| 亚洲黄色免费网站| 在线视频国内一区二区| 亚洲靠逼com| 91在线视频网址| 亚洲少妇中出一区| 一本色道a无线码一区v| ●精品国产综合乱码久久久久| av电影在线观看一区| 中文字幕一区二区三区四区不卡| 豆国产96在线|亚洲| 国产精品国产三级国产专播品爱网| 国产真实乱子伦精品视频| 337p粉嫩大胆噜噜噜噜噜91av | 中文文精品字幕一区二区| 韩国视频一区二区| 国产欧美日韩另类一区| 成人福利视频在线| 亚洲裸体xxx| 欧美日本一区二区| 精品一区二区三区免费视频| 久久久三级国产网站| 99久久精品国产精品久久| 一区二区激情视频| 69精品人人人人| 国产一区视频在线看| 国产精品不卡视频| 欧美无砖砖区免费| 久久av老司机精品网站导航| 国产欧美日韩三区| 欧美体内she精视频| 久久97超碰国产精品超碰| 中文字幕精品—区二区四季| 色婷婷av久久久久久久| 美国av一区二区| 中文字幕欧美三区| 欧美日韩国产综合一区二区三区 | 在线亚洲精品福利网址导航| 日本欧美一区二区| 中文av一区特黄| 欧美日韩国产123区| 国产91色综合久久免费分享| 亚洲国产成人精品视频| 久久嫩草精品久久久精品一| 色8久久人人97超碰香蕉987| 日韩avvvv在线播放| 国产精品久久久久久久久动漫 | 一区免费观看视频| 国产精品一区久久久久| 一区二区视频在线看| 日韩一区二区精品葵司在线| 成人av在线看| 美腿丝袜在线亚洲一区 | 亚洲精品免费在线观看| 久久人人超碰精品| 在线播放91灌醉迷j高跟美女| bt7086福利一区国产| 蜜臀av一区二区| 亚洲综合丁香婷婷六月香| 久久久精品欧美丰满| 欧美一级片在线看| 欧美亚洲动漫精品| 97se狠狠狠综合亚洲狠狠| 国产精品中文字幕欧美| 欧美日韩国产a| jizzjizzjizz欧美| 在线亚洲人成电影网站色www| 国产999精品久久久久久绿帽| 蜜桃精品在线观看| 午夜精品久久久久久久99水蜜桃| 日韩一区在线看| 国产女人18水真多18精品一级做 | 麻豆91在线看| 日欧美一区二区| 亚洲成人你懂的| 亚洲地区一二三色| 亚洲一区二区三区在线播放| 亚洲人成网站影音先锋播放| 国产精品久久久久天堂| 中文字幕一区三区| 中文字幕在线观看一区| 《视频一区视频二区| 亚洲欧美一区二区三区国产精品| 国产精品久久久久国产精品日日| 国产色产综合产在线视频 | 成av人片一区二区| 粉嫩13p一区二区三区| 成人小视频免费观看| 成人h动漫精品一区二区| 成人av资源站| 日本道色综合久久| 91豆麻精品91久久久久久| 欧美系列亚洲系列| 在线综合+亚洲+欧美中文字幕| 欧美色网一区二区| 欧美顶级少妇做爰| 精品第一国产综合精品aⅴ| ww亚洲ww在线观看国产| 国产精品久久夜| 一区二区三区在线观看视频| 天天操天天综合网| 韩国中文字幕2020精品| 国产成人午夜精品5599| 91啪亚洲精品| 91精品国产综合久久福利| 欧美精品一区二区三区蜜桃 | 成人久久久精品乱码一区二区三区| 丁香亚洲综合激情啪啪综合| 国产福利91精品一区二区三区| 成人av一区二区三区| 欧美图区在线视频| 日韩久久精品一区| 亚洲欧美自拍偷拍| 日韩成人免费在线| 国产91精品一区二区麻豆网站 | 色综合色狠狠天天综合色| 欧美视频在线一区| 亚洲精品一线二线三线无人区| 中文字幕在线免费不卡| 精彩视频一区二区三区| 成人精品一区二区三区四区| 欧美日韩一级二级| 国产三级一区二区三区| 午夜电影一区二区| 成人手机电影网| 日韩欧美国产午夜精品| 一区二区三区中文在线| 国产精品亚洲第一区在线暖暖韩国| 色综合天天综合在线视频| xnxx国产精品|