您好,欢迎访问一九零五行业门户网

MySQLSchema设计(三)利用Python操作Schema_MySQL

pythonbitscn.com
弓在箭要射出之前,低声对箭说道,“你的自由是我的”。schema如箭,弓似python,选择python,是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) [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.pyoutput 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) 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 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炼金术师
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() 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)
有2种方式,其一: in [5]: t.drop(bind=engine,checkfirst=true) 另一种是: in [5]: metadata.drop_all(bind=engine,checkfirst=true),其中可以借助tables属性指定要删除的对象
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 例子:
insertin [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 例子:
updatein [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 例子:
passivein [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
版本: [root@datahacker ~]# ./sesc.py --version 1.0 查看帮助: [root@datahacker ~]# ./sesc.py -h usage: sesc.py [options]
#!/usr/bin/env python import optparse from dbapi import * #构造optionparser实例,配置期望的选项 parser = optparse.optionparser(usage=%prog [options]
以上就是mysqlschema设计(三)利用python操作schema_mysql的内容。
其它类似信息

推荐信息