亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 13:14:55
字體:
來源:轉載
供稿:網友

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

Schema是什么?

不管我們做什么應用,只要和用戶輸入打交道,就有一個原則--永遠不要相信用戶的輸入數據。意味著我們要對用戶輸入進行嚴格的驗證,web開發時一般輸入數據都以JSON形式發送到后端API,API要對輸入數據做驗證。一般我都是加很多判斷,各種if,導致代碼很丑陋,能不能有一種方式比較優雅的驗證用戶數據呢?Schema就派上用場了。

㈠ MySQLdb部分

表結構:

mysql/23074.html">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 pythonimport optparsefrom 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.tablecolumn = options.colterm = options.termformat = 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 + 1else: 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方法詳解的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的,歡迎留言交流討論。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲91av视频| 成人精品一区二区三区电影免费| 国产精品成av人在线视午夜片| 欧洲亚洲在线视频| 国产精品入口免费视| 91av成人在线| 国产精品久久久久久久9999| 国内精品免费午夜毛片| 国产精品专区一| 国产精品视频免费观看www| 日韩av在线免播放器| 亚洲第一视频在线观看| 在线视频日本亚洲性| 欧美视频在线免费看| 成人激情视频小说免费下载| 久久国产精品久久精品| 成人信息集中地欧美| 欧美激情一二三| 性欧美在线看片a免费观看| 午夜精品久久久久久久男人的天堂| 中文字幕亚洲激情| 国产亚洲a∨片在线观看| 日本高清不卡的在线| 国产精品免费久久久久影院| 午夜精品美女自拍福到在线| 色哟哟网站入口亚洲精品| 国自在线精品视频| 97免费视频在线| 欧美亚洲国产视频小说| 91久久精品一区| 精品亚洲一区二区三区四区五区| 亚洲国产成人精品电影| 国产suv精品一区二区三区88区| 久久久久国产视频| 91国内在线视频| 国产精品无av码在线观看| 国产乱肥老妇国产一区二| 91久久精品国产| 国产aⅴ夜夜欢一区二区三区| 国产一区二区黑人欧美xxxx| 国产精品美女视频网站| www.亚洲一二| 亚洲国产99精品国自产| 日韩中文在线视频| 日韩极品精品视频免费观看| 国产精品a久久久久久| 隔壁老王国产在线精品| 色悠悠久久久久| 欧美疯狂做受xxxx高潮| 日韩国产高清视频在线| 国产美女精品免费电影| 国产精品爽黄69天堂a| 亚洲图片欧洲图片av| 欧美在线性视频| 欧美精品手机在线| 精品国产老师黑色丝袜高跟鞋| 亚洲天堂av在线免费| 免费97视频在线精品国自产拍| 欧美亚洲第一页| xx视频.9999.com| 亚洲综合中文字幕68页| 97碰在线观看| 欧美激情日韩图片| 欧美视频专区一二在线观看| 欧美黄色成人网| 日本一区二区不卡| 黑人巨大精品欧美一区二区| 亚洲国产成人精品久久久国产成人一区| 国产精品极品尤物在线观看| 亚洲成人网在线| 久久综合久久八八| 欧美亚洲第一页| 亚洲精品99久久久久中文字幕| 在线观看日韩www视频免费| 日韩在线观看免费全集电视剧网站| 国产精品一区二区三区久久| 日本精品性网站在线观看| 一个人www欧美| 亚洲第一偷拍网| 久久夜色精品国产欧美乱| 91亚洲精华国产精华| 911国产网站尤物在线观看| 欧美大秀在线观看| 97国产suv精品一区二区62| 夜色77av精品影院| 久久久久久久一区二区| 欧美性猛交丰臀xxxxx网站| 日韩的一区二区| 久久久国产一区| 国产欧美精品一区二区三区-老狼| www.亚洲成人| 8090理伦午夜在线电影| 亚洲第一页在线| 秋霞午夜一区二区| 亚洲最新av在线网站| 成人免费午夜电影| 国产精品电影久久久久电影网| 国产成人亚洲综合青青| 亚洲第一区第二区| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲一区www| 精品一区二区三区四区| 国产日韩在线亚洲字幕中文| 国产亚洲视频中文字幕视频| 欧美专区福利在线| 国产91色在线播放| 日韩视频在线一区| 68精品久久久久久欧美| 亚洲欧美综合精品久久成人| 国语自产精品视频在线看| 欧美野外猛男的大粗鳮| 亚洲最大成人免费视频| 久久视频在线观看免费| 精品国产精品三级精品av网址| 亚洲自拍偷拍区| 中文字幕一精品亚洲无线一区| 18久久久久久| 久久国产精品影视| 日韩成人中文字幕在线观看| 尤物yw午夜国产精品视频| 久久久视频在线| 91精品国产综合久久久久久久久| 午夜精品福利视频| 成人做爽爽免费视频| 国产又爽又黄的激情精品视频| 欧美激情va永久在线播放| 日韩高清免费观看| 久久亚洲欧美日韩精品专区| 久久影视电视剧凤归四时歌| 一区二区三区日韩在线| 精品国产一区二区在线| 91亚洲精品一区二区| 国产精品一区二区久久久| 九九九热精品免费视频观看网站| 海角国产乱辈乱精品视频| 欧美激情一区二区三级高清视频| 亚洲香蕉成人av网站在线观看| 26uuu亚洲伊人春色| 国产精品盗摄久久久| 国产精品久久久久久久久久久不卡| 欧美久久久精品| 国产丝袜高跟一区| 日韩中文字幕不卡视频| 欧美黄色片在线观看| 日韩在线免费视频| 在线亚洲男人天堂| 日韩av在线免费观看| 欧美日韩国产一区中文午夜| 日韩69视频在线观看| 国产精品久久久久影院日本| 欧美午夜影院在线视频| 久久久精品视频在线观看| 亚洲v日韩v综合v精品v| 欧美日韩性视频| 日韩中文在线中文网三级| 91在线免费观看网站| 日韩亚洲精品视频| 亚洲精品综合精品自拍| 国产91对白在线播放| 国产999精品久久久| 最好看的2019年中文视频| 成人黄色在线播放| 亚洲精品一区二区久| 精品动漫一区二区|