go-sql-driver / mysql

Go MySQL Driver is a MySQL driver for Go's (golang) database/sql package
https://pkg.go.dev/github.com/go-sql-driver/mysql
Mozilla Public License 2.0
14.45k stars 2.3k forks source link

add function to get the driver name #1591

Closed demoManito closed 2 months ago

demoManito commented 3 months ago

Description

Used to get the current driver name

Checklist

coderabbitai[bot] commented 3 months ago

[!WARNING]

Rate Limit Exceeded

@demoManito has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 45 minutes and 14 seconds before requesting another review.

How to resolve this issue? After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR. We recommend that you space out your commits to avoid hitting the rate limit.
How do rate limits work? CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our [FAQ](https://coderabbit.ai/docs/faq) for further information.
Commits Files that changed from the base of the PR and between 96db8c1a055fabfdb0f7e5330f05037a30347dc5 and 08013ac3e9b8cceac32a32e81a0bf6c23594defa.

Walkthrough

The recent update enhances the codebase by introducing a new function, DriverName(), in driver.go to retrieve the driver's name. Additionally, a test function TestName has been included in driver_test.go to ensure the accuracy of DriverName(). These changes streamline the process of obtaining the driver name and reinforce its reliability through testing.

Changes

File Change Summary
driver.go Added DriverName() function to return the driver name.
driver_test.go Added TestName function to verify the correctness of DriverName().

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)
Tips ### Chat There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai): - Review comments: Directly reply to a review comment made by CodeRabbit. Example: - `I pushed a fix in commit .` - `Generate unit testing code for this file.` - `Open a follow-up GitHub issue for this discussion.` - Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples: - `@coderabbitai generate unit testing code for this file.` - `@coderabbitai modularize this function.` - PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples: - `@coderabbitai generate interesting stats about this repository and render them as a table.` - `@coderabbitai show all the console.log statements in this repository.` - `@coderabbitai read src/utils.ts and generate unit testing code.` - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.` Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. ### CodeRabbit Commands (invoked as PR comments) - `@coderabbitai pause` to pause the reviews on a PR. - `@coderabbitai resume` to resume the paused reviews. - `@coderabbitai review` to trigger a review. This is useful when automatic reviews are disabled for the repository. - `@coderabbitai resolve` resolve all the CodeRabbit review comments. - `@coderabbitai help` to get help. Additionally, you can add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed. ### CodeRabbit Configration File (`.coderabbit.yaml`) - You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository. - Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information. - If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json` ### Documentation and Community - Visit our [Documentation](https://coderabbit.ai/docs) for detailed information on how to use CodeRabbit. - Join our [Discord Community](https://discord.com/invite/GsXnASn26c) to get help, request features, and share feedback. - Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.
methane commented 3 months ago

Please provide background information when you are proposing some new API.

Why do you need it? Does the database/sql/driver recommend it? Any other drivers provide it?

demoManito commented 3 months ago

Please provide background information when you are proposing some new API.

Why do you need it? Does the database/sql/driver recommend it? Any other drivers provide it?

hello @methane

Why do you need it?

When we create a link every time we need to enter it manually (for example: sql.Open("mysql", dsn)). the driver name you specify may be different from the name in the driver. If you don’t read the source code, the driver name is It is opaque, so the driver needs to provide a method to obtain the default driver name.

Use cases?

Use sql.Open(mysql.DriverName(), dsn). Or you can use ent.Open(mysql.DriverName(), dsn) when opening with ORM. I think this is a better way to call.

Any other drivers provide it?

These are some Java drivers that can get the driver name. Golang drivers rarely expose drivers. https://github.com/xerial/sqlite-jdbc/blob/ce109578d710e696ddc8ddae119bfd8f6f455a82/src/main/java/org/sqlite/jdbc3/JDBC3DatabaseMetaData.java#L222 https://github.com/pgjdbc/pgjdbc/blob/450488c142fdc368cab54e8257407603acc18c4f/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java#L170

demoManito commented 3 months ago

Please provide background information when you are proposing some new API.

Why do you need it? Does the database/sql/driver recommend it? Any other drivers provide it?

And driverName can be changed through build parameters. If the driver name is manually specified by an external layer, the code needs to be modified and rebuilt. Providing an externally exposed method to obtain driverName can solve these problems.

methane commented 3 months ago

Why driver.Connector() is not enough? If you want to directly depends on specific driver, you can use the Connector. If you want to avoid to depends on specific driver, you can not use mysql.DriverName().

And if it is common requirements, any preceding driver implement it?

demoManito commented 3 months ago

Why driver.Connector() is not enough? If you want to directly depends on specific driver, you can use the Connector. If you want to avoid to depends on specific driver, you can not use mysql.DriverName().

And if it is common requirements, any preceding driver implement it?

Drivers in other languages ​​have functions to obtain the provided driver name. Why only focus on the go language?

Would providing a function to get the default driver name cause any ill effects?

demoManito commented 3 months ago

Why driver.Connector() is not enough? If you want to directly depends on specific driver, you can use the Connector. If you want to avoid to depends on specific driver, you can not use mysql.DriverName().

And if it is common requirements, any preceding driver implement it?

image

Do you think ORM directly declaring mysql is a good choice? This is a common problem faced by many ORMs

methane commented 3 months ago

Drivers in other languages ​​have functions to obtain the provided driver name. Why only focus on the go language?

Because they don't use database/sql. This problem is tightly coupled with database/sql design.

Are there any problems with getting the default driver name provided here?

Any one public API has maintenance cost. We cannot remove or change its signature until v2. Unless the problem trying to solve is not specific to this driver or MySQL, we want to chose standard or common API. That's why I am asking earlier implementations of the API in the other popular drivers.

methane commented 3 months ago

Do you think ORM directly declaring mysql is a good choice? This is a common problem faced by many ORMs

Yes. Changing the linkname is very uncommon. So directly use "mysql" doesn't have any problem.

image image
dolmen commented 3 months ago

If the driver is registered via an alternate name, the developer who builds the program is aware of it and can provide it to anyone who needs it. We don't need to expose that flawed API in the driver.

By the way, it is also possible:

The proposed API doesn't handle those cases.

So I'm completely opposed to that change.

Disclaimer: I'm the author patch #1499 that allows to change the driver name