ホームページ >データベース >mysql チュートリアル >MySQLSchema设计(三)利用Python操作Schema_MySQL

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

PHP中文网
PHP中文网オリジナル
2016-05-27 14:12:261150ブラウズ

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的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。