{"id":15009911,"url":"https://github.com/lkmc2/python-sql-faker","last_synced_at":"2025-10-06T13:40:59.621Z","repository":{"id":57470552,"uuid":"152734332","full_name":"lkmc2/python-sql-faker","owner":"lkmc2","description":"轻量级、易拓展的数据库智能填充开源库（Python实现版）","archived":false,"fork":false,"pushed_at":"2019-03-12T10:14:32.000Z","size":223,"stargazers_count":14,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-31T14:58:14.215Z","etag":null,"topics":["h2","mysql","oracle","python2","python3","sql","sqlserver"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lkmc2.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-10-12T10:27:47.000Z","updated_at":"2025-04-11T03:27:36.000Z","dependencies_parsed_at":"2022-09-20T12:43:28.619Z","dependency_job_id":null,"html_url":"https://github.com/lkmc2/python-sql-faker","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lkmc2/python-sql-faker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lkmc2%2Fpython-sql-faker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lkmc2%2Fpython-sql-faker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lkmc2%2Fpython-sql-faker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lkmc2%2Fpython-sql-faker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lkmc2","download_url":"https://codeload.github.com/lkmc2/python-sql-faker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lkmc2%2Fpython-sql-faker/sbom","scorecard":{"id":595162,"data":{"date":"2025-08-11","repo":{"name":"github.com/lkmc2/python-sql-faker","commit":"a68ac9a011b75b23f20d961fa1da08597ebe9445"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/26 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":3,"reason":"binaries present in source code","details":["Warn: binary detected: sql_faker/sql_faker-1.1.7-py2-none-any.whl:1","Warn: binary detected: src/__init__.pyc:1","Warn: binary detected: src/asserts/__init__.pyc:1","Warn: binary detected: src/asserts/asserts.pyc:1","Warn: binary detected: src/random/__init__.pyc:1","Warn: binary detected: src/random/address_random.pyc:1","Warn: binary detected: src/random/random_abstract.pyc:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-20T22:58:49.706Z","repository_id":57470552,"created_at":"2025-08-20T22:58:49.707Z","updated_at":"2025-08-20T22:58:49.707Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278621847,"owners_count":26017253,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["h2","mysql","oracle","python2","python3","sql","sqlserver"],"created_at":"2024-09-24T19:29:06.035Z","updated_at":"2025-10-06T13:40:59.603Z","avatar_url":"https://github.com/lkmc2.png","language":"Python","readme":"# python-sql-faker\n#### 轻量级、易拓展的数据库智能填充开源库（Python实现版）\n\n## 开源库特性\n\n+ 支持主流的MySQL、Oracle、SQL Server、SQLite数据库\n+ 支持8种常见数据库字段类型的智能填充，并支持自定义拓展\n+ 支持一次性插入百万级别的数据\n+ 支持事务\n+ 支持python 2.7和python 3\n\n## 使用示范\n\n``` python\nfrom sql_faker import Faker, DataType, Values, Times, DBHelper\nimport pymysql\n\n# 设置数据库信息\nDBHelper.db_setting(db='python_sql_faker',\n                    driver=pymysql,\n                    user='root',\n                    passwd='123456',\n                    host='127.0.0.1',\n                    port=3306)\n\n#  给user表的四个字段填充5条数据\nFaker.table_name(\"user\") \\\n    .param(\"name\", DataType.USERNAME) \\\n    .param(\"age\", DataType.AGE) \\\n    .param(\"address\", DataType.ADDRESS) \\\n    .param(\"birthday\", DataType.TIME) \\\n    .insert_count(5) \\\n    .execute()\n```\n\n上述代码将生成如下SQL语句，并在数据库中执行：\n\n```sql\ninsert into user(name,age,sex,address,birthday) values('武叹霜', 21, '山西省晋城市泽州县庆达路463号', '2018-02-24 10:56:37')\ninsert into user(name,age,sex,address,birthday) values('顾什可', 50, '广西壮族自治区柳州市融水苗族自治县德堡路419号', '2018-04-09 08:10:22')\ninsert into user(name,age,sex,address,birthday) values('蔡静随', 46, '河南省郑州市巩义市广延路240号', '2018-06-11 23:02:19')\ninsert into user(name,age,sex,address,birthday) values('韦丸赤', 27, '河南省焦作市博爱县浦润路148号', '2018-02-22 15:52:50')\ninsert into user(name,age,sex,address,birthday) values('任徐', 54, '河南省新乡市延津县汉源路14号', '2018-07-07 03:48:51')\n```\n\n\n\n## 依赖添加\n\n本开源库另外依赖了DBUtils和pymysql库，需要一起进行pip安装。\n\n``` python\npip install sql-faker\npip install DBUtils\npip install pymysql\n```\n\n如果安装不成功，点此连接进行下载whl文件 \u003ca href=\"https://raw.githubusercontent.com/lkmc2/python-sql-faker/master/sql_faker/sql_faker-1.1.7-py2-none-any.whl\"\u003e点击下载\u003c/a\u003e。\n\n然后在控制台中移动到文件下载路径执行如下命令：\n\n```cmd\ncd 下载路径\npip install sql_faker-1.1.7-py2-none-any.whl\n```\n\n\n\n**注意**：默认使用MySQL数据库，如需更换成Oracle、SQL Server、SQLite等DBUtils连接池支持的数据库，可另行添加依赖，并在DBHelper.db_setting(driver=驱动对象)方法中指定数据库驱动。\n\n\n\n## 数据库连接\n\n#### 一、连接属性设置\n\n在进行插入数据之前需要设置数据库属性，如代码所示：\n\n``` python\nfrom sql_faker import DBHelper\nimport pymysql\n\n# 设置数据库信息\nDBHelper.db_setting(db='python_sql_faker',\n                    driver=pymysql, # 设置连接驱动\n                    user='root',\n                    passwd='123456',\n                    host='127.0.0.1',\n                    port=3306)\n```\n\n\n可设置的属性如下表：\n\n|  属性名   |   说明    |    默认值    |\n| :----: | :-----: | :-------: |\n|   db   |  数据库名   |     无     |\n| driver | 数据库驱动对象 |  pymysql  |\n|  user  | 数据库用户名  |   root    |\n| passwd |  数据库密码  |   12345   |\n|  host  |  主机地址   | localhost |\n|  port  |   端口号   |   3306    |\n\n\n\n#### 二、特殊情况\n\n1. 当数据库属性值都等于默认值时，可只设置数据库名：\n\n``` python\nDBHelper.db_setting('python_sql_faker')\n```\n\n\n\n#### 三、支持的驱动类型\n\n```python\n# 支持的驱动类型，可在DBHelper.db_setting(driver=驱动对象)方法指定数据库驱动\n# 1.首先在控制台进行pip安装\npip install pymysql # mysql\npip install pymssql # sqlserver\npip install cx_Oracle # oracle\npip install sqlite3 # sqlite3\n\n# 2.之后导入所需驱动，设置到driver属性中\nDBHelper.db_setting(db='python_sql_faker',\n                    driver=cx_Oracle) # 设置连接驱动\n```\n\n\n\n**注意** ：数据库配置只需要设置一次，之后可以多次调用Faker进行插入数据操作。\n\n\n\n## 数据插入\n\n### 一、属性介绍\n可设置的属性如下表：\n\n|         属性名          |          说明           |\n| :------------------: | :-------------------: |\n|  table_name(数据库表名)   |        设置数据库表名        |\n| param(字段名, 数据生成器类型①) | 设置数据库字段名，以及对应的数据生成器类型 |\n|  insert_count(插入条数)  |       设置插入数据条数        |\n|      execute( )      | 生成SQL，显示在控制台，并在数据库中执行 |\n|   only_show_sql( )   |     生成SQL，并显示在控制台     |\n|      ignored( )      |        不执行任何操作        |\n\n注意：① 数据生成器类型，必须是DataType枚举值，或实现了RandomData接口的类。\n\n使用示例：\n``` java\n// 给user表的四个字段填充5条数据\nFaker.table_name(\"user\") \\\n    .param(\"name\", DataType.USERNAME) \\\n    .param(\"age\", DataType.AGE) \\\n    .param(\"sex\", DataType.SEX) \\\n    .param(\"birthday\", DataType.TIME) \\\n    .insert_count(5) \\\n    .execute()\n\n// 给user表的两个字段生成5条SQL，并显示在控制台\nFaker.table_name(\"user\") \\\n    .param(\"name\", DataType.USERNAME) \\\n    .param(\"age\", DataType.AGE) \\\n    .insert_count(5) \\\n    .only_show_sql()\n\n// 不执行任何操作，不生成SQL，不显示在控制台\nFaker.table_name(\"user\") \\\n    .param(\"name\", DataType.USERNAME) \\\n    .param(\"age\", DataType.AGE) \\\n    .insert_count(5) \\\n    .ignored()\n```\n\n\n\n### 二、插入数据的方式\n\n本开源库一共支持三种插入数据的方式，可以混合使用。\n\n#### 1. 使用DataType指定数据类型\n\nDataType一共支持8种枚举类型，如下表所示：\n\n|   属性名    |  说明  |         类型         |         示例值         |\n| :------: | :--: | :----------------: | :-----------------: |\n|    ID    | 用户ID |   19位的数字型UUID字符串   | 1049120504188764160 |\n| USERNAME | 用户名  |    长度为2到4个字的中文名    |         武叹霜         |\n|   TIME   |  时间  | 一年前到现在的时间范围内任意一个时刻 | 2018-03-01 12:41:00 |\n|  PHONE   | 手机号  |       11位手机号       |     13192668109     |\n| ADDRESS  |  地址  |    国内地址，详细到门牌号     |  四川省绵阳市盐亭县北利路738号   |\n|   AGE    |  年龄  |     18到60岁的数字      |         19          |\n|   SEX    |  性别  |     字符，0：男，1：女     |         '1'         |\n|  EMAIL   |  邮箱  |      常见邮箱字符串       |  Alex705@gmail.com  |\n\n使用示例：\n\n```java\n// 给user表的8个字段填充1条数据\nFaker.table_name(\"user\") \\\n    .param(\"id\", DataType.ID) \\\n    .param(\"name\", DataType.USERNAME) \\\n    .param(\"birthday\", DataType.TIME) \\\n    .param(\"phone\", DataType.PHONE) \\\n    .param(\"address\", DataType.ADDRESS) \\\n    .param(\"age\", DataType.AGE) \\\n    .param(\"sex\", DataType.SEX) \\\n    .param(\"email\", DataType.EMAIL) \\\n    .insert_count(1) \\\n    .execute()\n```\n对应生成的SQL语句如下：\n\n```sql\ninsert into \nuser(\n  id, name, birthday,\n  phone, address, age,\n  sex, email\n) \nvalues(\n  '1049120504188764160', '武叹霜', '2018-03-01 12:41:00',\n  '13192668109', '四川省绵阳市盐亭县北利路73号', 19,\n   '1', 'Alex705@gmail.com'\n)\n```\n\n\n\n#### 2. 使用 Values.of()系列方法生成取值范围\n\nValues类共有以下8种生成取值范围方法，如下表：\n\n\n|                方法名                |                  取值范围                   |         示例值         |\n| :-------------------------------: | :-------------------------------------: | :-----------------: |\n|         Values.of(可变长参数)          |             从可变长参数中任意抽取一个值              |  \"优品\", \"良品\", \"次品\"   |\n|   Values.of_int_range(起始值,结束值)    |          在[起始值, 结束值]的范围内取一个整数           |         33          |\n| Values.of_float_range(起始值,结束值,精度) | 在[起始值, 结束值]的范围内取一个浮点数，默认精确到小数点后2位，最多10位 |     123.333333f     |\n|   Values.of_time_range(开始时间，结束时间)   |       在[开始时间, 结束时间]的范围内取一个时间，精确到秒       | 2018-03-14 13:21:11 |\n\n另外，Times类中还有用于设定时间的两个方法：\n\n|          方法名          |     说明      |\n| :-------------------: | :---------: |\n|    Times.of(年,月,日)    | 用于生成时间，精确到日 |\n| Times.of(年,月,日,时,分,秒) | 用于生成时间，精确到秒 |\n\n\n\n使用示例：\n\n\n\n```java\n// 给product表的9个字段填充1条数据\nFaker.table_name(\"product\")\\\n      .param(\"type\", Values.of(\"优品\", \"良品\", \"次品\"))\\\n      .param(\"person_count\", Values.of_int_range(20, 50))\\\n      .param(\"enter_price\", Values.of_float_range(12.33, 34.57))\\\n      .param(\"outcome_price\", Values.of_float_range(100.004132, 240.281424, 6))\\\n      .param(\"firstTime\", Values.of_time_range(Times.of(2018,3,22), Times.of(2018,10,22)))\\\n      .param(\"secondTime\",\n             Values.of_time_range(\n                Times.of(2018,3,22,11,23,24),\n                Times.of(2018,10,22,22,15,17)\n             )\n       )\\\n      .insert_count(1)\\\n      .only_show_sql()\n```\n\n对应生成的SQL语句如下：\n\n```sql\ninsert into \nproduct(\n  type, person_count, total_count,\n  enter_price, outcome_price, speed,\n  salary, firstTime, secondTime\n) \nvalues(\n  '良品', 33, 777777777,\n  22.22, 123.333333, 788.31,\n  1820.4231, '2018-03-14 00:00:00', '2018-03-14 13:21:11'\n)\n```\n\n\n\n#### 3. 继承RandomData类，重写create()方法，提供可随机生成的返回值\n\nRandomData类的代码如下：\n\n```java\nclass RandomData:\n    \"\"\"随机值抽象类，子类必须实现create方法\"\"\"\n    __metaclass__ = ABCMeta\n\n    @abstractmethod\n    def create(self):\n        pass\n```\n\n继承该类，并重写create( )方法提供一个可随机生成的返回值，该返回值就是数据库字段对应插入的值。\n\n使用示例：\n\n1. 创建一个自定义类EnglishNameRandom，继承RandomData类，并提供一个可随机生成的返回值。\n\n``` python\nimport random\nfrom sql_faker import Faker, DataType, Values, Times, DBHelper, RandomData\n\n# 英文名数据生成器\nclass EnglishNameRandom(RandomData):\n    def create(self):\n        # 使用choice()方法从列表中随机抽取一个值，作为返回值\n        return random.choice(['jack', 'andy', 'kim']) \n```\n\n2. 在Faker中给字段指定使用EnglishNameRandom类型的生成器。\n\n```java\n// 指定name字段使用EnglishNameRandom类进行随机值的生成\nFaker.table_name(\"user\")\\\n       .param(\"name\", EnglishNameRandom)\\\n       .param(\"age\", Values.of_int_range(20, 50))\\\n       .param(\"address\", DataType.ADDRESS)\\\n       .insert_count(5)\\\n       .execute()\n```\n\n对应生成的SQL语句如下：\n```sql\ninsert into user(name, age, address) \nvalues('Andy Wang', 23, '四川省绵阳市盐亭县北利路73号')\n```\n\n\nPS：如果有任何建议，可以在Issues中提出，如添加DataType的默认类型等。\n\n\n\n## License\n\nThe python-sql-faker is released under MIT License.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flkmc2%2Fpython-sql-faker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flkmc2%2Fpython-sql-faker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flkmc2%2Fpython-sql-faker/lists"}