在開(kāi)發(fā)的過(guò)程中独柑,往往會(huì)碰到要給數(shù)據(jù)庫(kù)填充數(shù)據(jù)的問(wèn)題,為了快速生成盡可能接近真實(shí)的數(shù)據(jù)私植,本人開(kāi)發(fā)了sql-faker忌栅,以下是該開(kāi)源庫(kù)的介紹。
開(kāi)源庫(kù)特性
- 支持主流的MySQL曲稼、Oracle索绪、SQL Server、SQLite數(shù)據(jù)庫(kù)
- 支持8種常見(jiàn)數(shù)據(jù)庫(kù)字段類型的智能填充贫悄,并支持自定義拓展
- 支持一次性插入百萬(wàn)級(jí)別的數(shù)據(jù)
- 支持事務(wù)
- 支持python2.7
使用示范
from sql_faker import Faker, DataType, Values, Times, DBHelper
import pymysql
# 設(shè)置數(shù)據(jù)庫(kù)信息
DBHelper.db_setting(db='python_sql_faker',
driver=pymysql,
user='root',
passwd='123456',
host='127.0.0.1',
port=3306)
# 給user表的四個(gè)字段填充5條數(shù)據(jù)
Faker.table_name("user") \
.param("name", DataType.USERNAME) \
.param("age", DataType.AGE) \
.param("address", DataType.ADDRESS) \
.param("birthday", DataType.TIME) \
.insert_count(5) \
.execute()
上述代碼將生成如下SQL語(yǔ)句者春,并在數(shù)據(jù)庫(kù)中執(zhí)行:
insert into user(name,age,sex,address,birthday) values('武嘆霜', 21, '山西省晉城市澤州縣慶達(dá)路463號(hào)', '2018-02-24 10:56:37')
insert into user(name,age,sex,address,birthday) values('顧什可', 50, '廣西壯族自治區(qū)柳州市融水苗族自治縣德堡路419號(hào)', '2018-04-09 08:10:22')
insert into user(name,age,sex,address,birthday) values('蔡靜隨', 46, '河南省鄭州市鞏義市廣延路240號(hào)', '2018-06-11 23:02:19')
insert into user(name,age,sex,address,birthday) values('韋丸赤', 27, '河南省焦作市博愛(ài)縣浦潤(rùn)路148號(hào)', '2018-02-22 15:52:50')
insert into user(name,age,sex,address,birthday) values('任徐', 54, '河南省新鄉(xiāng)市延津縣漢源路14號(hào)', '2018-07-07 03:48:51')
依賴添加
本開(kāi)源庫(kù)另外依賴了DBUtils和pymysql庫(kù),需要一起進(jìn)行pip安裝清女。
pip install sql-faker
pip install DBUtils
pip install pymysql
如果安裝不成功钱烟,點(diǎn)此連接進(jìn)行下載whl文件 點(diǎn)擊下載。
然后在控制臺(tái)中移動(dòng)到文件下載路徑嫡丙,執(zhí)行如下命令:
cd 下載路徑
pip install sql_faker-1.1.7-py2-none-any.whl
注意:默認(rèn)使用MySQL數(shù)據(jù)庫(kù)拴袭,如需更換成Oracle、SQL Server曙博、SQLite等DBUtils連接池支持的數(shù)據(jù)庫(kù)拥刻,可另行添加依賴,并在DBHelper.db_setting(driver=驅(qū)動(dòng)對(duì)象)方法中指定數(shù)據(jù)庫(kù)驅(qū)動(dòng)父泳。
數(shù)據(jù)庫(kù)連接
一般哼、連接屬性設(shè)置
在進(jìn)行插入數(shù)據(jù)之前需要設(shè)置數(shù)據(jù)庫(kù)屬性,如代碼所示:
from sql_faker import DBHelper
import pymysql
# 設(shè)置數(shù)據(jù)庫(kù)信息
DBHelper.db_setting(db='python_sql_faker',
driver=pymysql, # 設(shè)置連接驅(qū)動(dòng)
user='root',
passwd='123456',
host='127.0.0.1',
port=3306)
可設(shè)置的屬性如下表:
屬性名 | 說(shuō)明 | 默認(rèn)值 |
---|---|---|
db | 數(shù)據(jù)庫(kù)名 | 無(wú) |
driver | 數(shù)據(jù)庫(kù)驅(qū)動(dòng)對(duì)象 | pymysql |
user | 數(shù)據(jù)庫(kù)用戶名 | root |
passwd | 數(shù)據(jù)庫(kù)密碼 | 12345 |
host | 主機(jī)地址 | localhost |
port | 端口號(hào) | 3306 |
二惠窄、特殊情況
- 當(dāng)數(shù)據(jù)庫(kù)屬性值都等于默認(rèn)值時(shí)蒸眠,可只設(shè)置數(shù)據(jù)庫(kù)名:
DBHelper.db_setting('python_sql_faker')
三、支持的驅(qū)動(dòng)類型
# 支持的驅(qū)動(dòng)類型杆融,可在DBHelper.db_setting(driver=驅(qū)動(dòng)對(duì)象)方法指定數(shù)據(jù)庫(kù)驅(qū)動(dòng)
# 1.首先在控制臺(tái)進(jìn)行pip安裝
pip install pymysql # mysql
pip install pymssql # sqlserver
pip install cx_Oracle # oracle
pip install sqlite3 # sqlite3
# 2.之后導(dǎo)入所需驅(qū)動(dòng)楞卡,設(shè)置到driver屬性中
DBHelper.db_setting(db='python_sql_faker',
driver=cx_Oracle) # 設(shè)置連接驅(qū)動(dòng)
注意 :數(shù)據(jù)庫(kù)配置只需要設(shè)置一次,之后可以多次調(diào)用Faker進(jìn)行插入數(shù)據(jù)操作脾歇。
數(shù)據(jù)插入
一蒋腮、屬性介紹
可設(shè)置的屬性如下表:
屬性名 | 說(shuō)明 |
---|---|
table_name(數(shù)據(jù)庫(kù)表名) | 設(shè)置數(shù)據(jù)庫(kù)表名 |
param(字段名, 數(shù)據(jù)生成器類型①) | 設(shè)置數(shù)據(jù)庫(kù)字段名,以及對(duì)應(yīng)的數(shù)據(jù)生成器類型 |
insert_count(插入條數(shù)) | 設(shè)置插入數(shù)據(jù)條數(shù) |
execute( ) | 生成SQL藕各,顯示在控制臺(tái)池摧,并在數(shù)據(jù)庫(kù)中執(zhí)行 |
only_show_sql( ) | 生成SQL,并顯示在控制臺(tái) |
ignored( ) | 不執(zhí)行任何操作 |
注意:① 數(shù)據(jù)生成器類型激况,必須是DataType枚舉值作彤,或?qū)崿F(xiàn)了RandomData接口的類膘魄。
使用示例:
// 給user表的四個(gè)字段填充5條數(shù)據(jù)
Faker.table_name("user") \
.param("name", DataType.USERNAME) \
.param("age", DataType.AGE) \
.param("sex", DataType.SEX) \
.param("birthday", DataType.TIME) \
.insert_count(5) \
.execute()
// 給user表的兩個(gè)字段生成5條SQL,并顯示在控制臺(tái)
Faker.table_name("user") \
.param("name", DataType.USERNAME) \
.param("age", DataType.AGE) \
.insert_count(5) \
.only_show_sql()
// 不執(zhí)行任何操作宦棺,不生成SQL瓣距,不顯示在控制臺(tái)
Faker.table_name("user") \
.param("name", DataType.USERNAME) \
.param("age", DataType.AGE) \
.insert_count(5) \
.ignored()
二、插入數(shù)據(jù)的方式
本開(kāi)源庫(kù)一共支持三種插入數(shù)據(jù)的方式代咸,可以混合使用蹈丸。
1. 使用DataType指定數(shù)據(jù)類型
DataType一共支持8種枚舉類型,如下表所示:
屬性名 | 說(shuō)明 | 類型 | 示例值 |
---|---|---|---|
ID | 用戶ID | 19位的數(shù)字型UUID字符串 | 1049120504188764160 |
USERNAME | 用戶名 | 長(zhǎng)度為2到4個(gè)字的中文名 | 武嘆霜 |
TIME | 時(shí)間 | 一年前到現(xiàn)在的時(shí)間范圍內(nèi)任意一個(gè)時(shí)刻 | 2018-03-01 12:41:00 |
PHONE | 手機(jī)號(hào) | 11位手機(jī)號(hào) | 13192668109 |
ADDRESS | 地址 | 國(guó)內(nèi)地址呐芥,詳細(xì)到門(mén)牌號(hào) | 四川省綿陽(yáng)市鹽亭縣北利路738號(hào) |
AGE | 年齡 | 18到60歲的數(shù)字 | 19 |
SEX | 性別 | 字符逻杖,0:男,1:女 | '1' |
郵箱 | 常見(jiàn)郵箱字符串 | Alex705@gmail.com |
使用示例:
// 給user表的8個(gè)字段填充1條數(shù)據(jù)
Faker.table_name("user") \
.param("id", DataType.ID) \
.param("name", DataType.USERNAME) \
.param("birthday", DataType.TIME) \
.param("phone", DataType.PHONE) \
.param("address", DataType.ADDRESS) \
.param("age", DataType.AGE) \
.param("sex", DataType.SEX) \
.param("email", DataType.EMAIL) \
.insert_count(1) \
.execute()
對(duì)應(yīng)生成的SQL語(yǔ)句如下:
insert into
user(
id, name, birthday,
phone, address, age,
sex, email
)
values(
'1049120504188764160', '武嘆霜', '2018-03-01 12:41:00',
'13192668109', '四川省綿陽(yáng)市鹽亭縣北利路73號(hào)', 19,
'1', 'Alex705@gmail.com'
)
2. 使用 Values.of()系列方法生成取值范圍
Values類共有以下8種生成取值范圍方法思瘟,如下表:
方法名 | 取值范圍 | 示例值 |
---|---|---|
Values.of(可變長(zhǎng)參數(shù)) | 從可變長(zhǎng)參數(shù)中任意抽取一個(gè)值 | "優(yōu)品", "良品", "次品" |
Values.of_int_range(起始值,結(jié)束值) | 在[起始值, 結(jié)束值]的范圍內(nèi)取一個(gè)整數(shù) | 33 |
Values.of_float_range(起始值,結(jié)束值,精度) | 在[起始值, 結(jié)束值]的范圍內(nèi)取一個(gè)浮點(diǎn)數(shù)荸百,默認(rèn)精確到小數(shù)點(diǎn)后2位,最多10位 | 123.333333f |
Values.of_time_range(開(kāi)始時(shí)間滨攻,結(jié)束時(shí)間) | 在[開(kāi)始時(shí)間, 結(jié)束時(shí)間]的范圍內(nèi)取一個(gè)時(shí)間够话,精確到秒 | 2018-03-14 13:21:11 |
另外,Times類中還有用于設(shè)定時(shí)間的兩個(gè)方法:
方法名 | 說(shuō)明 |
---|---|
Times.of(年,月,日) | 用于生成時(shí)間光绕,精確到日 |
Times.of(年,月,日,時(shí),分,秒) | 用于生成時(shí)間女嘲,精確到秒 |
使用示例:
// 給product表的9個(gè)字段填充1條數(shù)據(jù)
Faker.table_name("product")\
.param("type", Values.of("優(yōu)品", "良品", "次品"))\
.param("person_count", Values.of_int_range(20, 50))\
.param("enter_price", Values.of_float_range(12.33, 34.57))\
.param("outcome_price", Values.of_float_range(100.004132, 240.281424, 6))\
.param("firstTime", Values.of_time_range(Times.of(2018,3,22), Times.of(2018,10,22)))\
.param("secondTime",
Values.of_time_range(
Times.of(2018,3,22,11,23,24),
Times.of(2018,10,22,22,15,17)
)
)\
.insert_count(1)\
.only_show_sql()
對(duì)應(yīng)生成的SQL語(yǔ)句如下:
insert into
product(
type, person_count, total_count,
enter_price, outcome_price, speed,
salary, firstTime, secondTime
)
values(
'良品', 33, 777777777,
22.22, 123.333333, 788.31,
1820.4231, '2018-03-14 00:00:00', '2018-03-14 13:21:11'
)
3. 繼承RandomData類,重寫(xiě)create()方法诞帐,提供可隨機(jī)生成的返回值
RandomData類的代碼如下:
class RandomData:
"""隨機(jī)值抽象類欣尼,子類必須實(shí)現(xiàn)create方法"""
__metaclass__ = ABCMeta
@abstractmethod
def create(self):
pass
繼承該類,并重寫(xiě)create( )方法提供一個(gè)可隨機(jī)生成的返回值停蕉,該返回值就是數(shù)據(jù)庫(kù)字段對(duì)應(yīng)插入的值愕鼓。
使用示例:
- 創(chuàng)建一個(gè)自定義類EnglishNameRandom,繼承RandomData類慧起,并提供一個(gè)可隨機(jī)生成的返回值菇晃。
import random
from sql_faker import Faker, DataType, Values, Times, DBHelper, RandomData
# 英文名數(shù)據(jù)生成器
class EnglishNameRandom(RandomData):
def create(self):
# 使用choice()方法從列表中隨機(jī)抽取一個(gè)值,作為返回值
return random.choice(['jack', 'andy', 'kim'])
- 在Faker中給字段指定使用EnglishNameRandom類型的生成器完慧。
// 指定name字段使用EnglishNameRandom類進(jìn)行隨機(jī)值的生成
Faker.table_name("user")\
.param("name", EnglishNameRandom)\
.param("age", Values.of_int_range(20, 50))\
.param("address", DataType.ADDRESS)\
.insert_count(5)\
.execute()
對(duì)應(yīng)生成的SQL語(yǔ)句如下:
insert into user(name, age, address)
values('Andy Wang', 23, '四川省綿陽(yáng)市鹽亭縣北利路73號(hào)')
PS:如果有任何建議谋旦,可以在Issues中提出,如添加DataType的默認(rèn)類型等屈尼。
License
The python-sql-faker is released under MIT License.